分散光了,厚着脸皮来问个问题

指向一个结构体A的指针ptrA, 强行转换为指向结构体B的指针ptrB,其中结构体B占空间比A占的空间大,为什么不会发生取不到B所占的空间的大小的情况?假如ptrA所指向的地址之后sizeof(A)个字节之后存储的是其他需要用到的变量呢?
还有,用内存需要先申请再使用。为什么不能指定一个地址去使用呢?假如说那个地址可能保存这其他变量,而上面的情况为什么又可以呢?申请内存,在编译器中究竟发生怎么样的事情
# 1
>指向一个结构体A的指针ptrA, 强行转换为指向结构体B的指针ptrB,其中结构体B占空间比A占的
>空间大,为什么不会发生取不到B所占的空间的大小的情况?假如ptrA所指向的地址之后sizeof
>(A)个字节之后存储的是其他需要用到的变量呢?

与其他语言比如其派生语言C++比较,C不是一种强类型的语言。
指针pa指向不兼容对象b,在传统模式ansi下,编译器不会对此告警;在c99模式下,产生告警,但不是错误。
在C++中,这是一个错误。

在需要传递不同类型对象地址时,使用通用指针。需要知道通用指针所指对象类型,以便恢复使用正确类型指针,并解引用读取。

int main(void){
struct A{}a, *pa = &a;
struct B{}b;
void *p;

pa = &b; /*line 6*/
p = pa;
p = &a;

return 0;
}

/*
$ gcc -std=c99 -Wall -W a.c
a.c: In function `main':
a.c:6: warning: assignment from incompatible pointer type
$ g++ a.cpp
a.cpp: In function `int main()':
a.cpp:6: error: cannot convert `main()::B*' to `main()::A*' in assignment
$
*/

>还有,用内存需要先申请再使用。为什么不能指定一个地址去使用呢?假如说那个地址可能保存
>这其他变量,而上面的情况为什么又可以呢?申请内存,在编译器中究竟发生怎么样的事情

显式申请内存就是敦促系统指定可用地址,并需要告知系统何时收回使用权。系统管理内存资源,知道所余可用内存尺寸、地址。作为程序员的人不知道哪些内存被使用,哪些没有。C、C++语言提供了之间访问硬件地址的能力。使用了不当的如内存等硬件资源,则存在风险。
# 2
与其他语言比如其派生语言C++比较,C不是一种强类型的语言。
指针pa指向不兼容对象b,在传统模式ansi下,编译器不会对此告警;在c99模式下,产生告警,但不是错误。
________
谢谢楼上的 。
但是还是不明白,假如结构体B比A大,为什么没有可能发生结构体A空间之后的空间,也就是sizeof(B)-sizeof(A)个字节内保存的是其他需要用的变量呢?

______________________________
|________________|____________|
ptrA x y
ptrB

也就是A 的结构体大小为 X-ptrA 个字节,而B的大小是y-ptrB 个字节。假如之前空间x到y之间保存的是其他需要用的变量呢。按我理解,这样就出错了。但是在我们的程序中,很多是这样作用的。我们用C。

# 3
如果你的sizeof(B)-sizeof(A)个字节内保存的是其他需要用的变量,那么当然也就可以通过指向结构体B的这个指针引用到,只是引用的肯定是对B结构来说无意义的数据,这就是指针的强大之处哦

或者你想溢出探测?