使用指针访问结构元素

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评估的是有效地址.有人可以解释一下我错了吗?

AnT*_*AnT 5

你的期望是没有根据的.取消引用空指针时,C程序不一定"崩溃".当您尝试执行类似的操作时,C程序会出现所谓的未定义行为.未定义的行为可以通过许多不同的方式表现出来.它可能导致崩溃.或者它可以产生甚至类似于"工作"程序的东西.后者显然是你的情况.

但无论如何,你的程序的行为是不确定的.不,它不会产生一个"有效地址",因为你似乎错误地相信.对应于内存中没有对象存在的位置的数字地址无效(当然,空指针值除外).


Rap*_*sek 2

&ptr->b == sizeof(int),这意味着after (类型)b内相对于地址的偏移量。的偏移量(典型的 32 位架构)保存在指针内。您必须访问才能获得段错误。_x_x.aint*((x*)0)4dd