struct A {
int i;
int j;
};
int main()
{
int *i;
struct A *a = 0;
i = &(a->j);
}
指针a的值是0,&(a->j)会报访问错误么?
不会。
main:
pushq %rbp
movq %rsp, %rbp
movq $0, -8(%rbp)
movq -8(%rbp), %rax
addq $4, %rax
movq %rax, -16(%rbp)
movl $0, %eax
popq %rbp
ret
参看反汇编的源码,可知道编译器对于&(a->j)的解析,并不是先去取得a->j这个量,然后用&去取地址的。而是直接使用a的地址来计算a->j的地址的。所以这儿没有对a的解引用。
参考
https://godbolt.org/