Aru*_*esh 5 c pointers structure
当下面的程序没有崩溃时,我感到很惊讶.
typedef struct _x {
int a;
char b;
int c;
} x;
main() {
x *ptr = 0;
char *d = &ptr->b;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,->运营商优先于&运营商.所以当我们尝试取消引用NULL指针时,我希望程序在下面的语句中崩溃tr.
char *d = &ptr->b;
Run Code Online (Sandbox Code Playgroud)
但该声明&ptr->b评估的是有效地址.有人可以解释一下我错了吗?
你的期望是没有根据的.取消引用空指针时,C程序不一定"崩溃".当您尝试执行类似的操作时,C程序会出现所谓的未定义行为.未定义的行为可以通过许多不同的方式表现出来.它可能导致崩溃.或者它可以产生甚至类似于"工作"程序的东西.后者显然是你的情况.
但无论如何,你的程序的行为是不确定的.不,它不会产生一个"有效地址",因为你似乎错误地相信.对应于内存中没有对象存在的位置的数字地址无效(当然,空指针值除外).
&ptr->b == sizeof(int),这意味着after (类型)b内相对于地址的偏移量。的偏移量(典型的 32 位架构)保存在指针内。您必须访问才能获得段错误。_x_x.aint*((x*)0)4dd