不了解编译器的行为

Aru*_*pal 2 c++ gcc pointers

我想了解为什么下面的代码实际工作,而不是给出一个seg错误.我有一位同事告诉我这件事,我感到很惊讶.

有人可以解释并指出一些良好的链接,以弥合我对此的理解吗?

struct Test {
    int __in;
    int __in1;
};

int main()
{
    struct Test* t = NULL;
    int i = &(t->__in1) + 4;
    std::cout << i << std::endl;
}

arun@arun-desktop:~/Code$ g++ -fpermissive -g test8.cc 
test8.cc: In function ‘int main()’:
test8.cc:11:24: warning: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
arun@arun-desktop:~/Code$ ./a.out   
20
arun@arun-desktop:~/Code$ 
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 8

如果尝试访问无效内存,则只会出现分段错误.您的代码只执行指针运算,调整指针以Test获取指向其成员之一的指针,并且不读取或写入指针的目标.

它仍然是未定义的行为.小孩,不要在家里这样做.

(另外,不要使用像.这样的保留名称__in1.不要使用-fpermissive这样的无意义转换:类型系统可以帮助你.)