C 为什么这段代码能够访问空指针而不会导致崩溃?

C 为什么这段代码能够访问空指针而不会导致崩溃?,c,pointers,crash,null-pointer,C,Pointers,Crash,Null Pointer,我遇到了下面一段代码,它查找结构中某个成员的偏移量。但是,我无法理解为什么它不会崩溃,即使它尝试取消传递空指针 struct a_ { int a; int b; }; int main() { int offset = &(((struct a_ *) 0x0)->b); printf ("offset of b = %x\n", offset); } Output = 4 然而,我无法理解为什么它不会崩溃,即使它试图取消传递空指针 您正在

我遇到了下面一段代码,它查找结构中某个成员的偏移量。但是,我无法理解为什么它不会崩溃,即使它尝试取消传递空指针

struct a_
{
    int a;
    int b;
};

int main()
{
    int offset = &(((struct a_ *) 0x0)->b);
    printf ("offset of b = %x\n", offset);
} 

Output = 4
然而,我无法理解为什么它不会崩溃,即使它试图取消传递空指针

您正在形成一个无效地址,该地址是未定义的行为,但由于取消取消引用的
&
运算符,没有取消对空指针的引用

然而,我无法理解为什么它不会崩溃,即使它试图取消传递空指针


您正在形成一个无效地址,该地址是未定义的行为,但由于取消取消引用的
&
运算符,没有取消对空指针的引用。

从技术上讲,它是未定义的行为,但是,任何一个好的编译器都能够在编译过程中解析表达式,因此不会发生空指针访问。实际上,它不是反引用空指针0。它获取放置在地址0上的
struct a_uu
类型变量中的
b
字段的地址。因此,它在
结构a中获得
b
的偏移量。它恰好与
偏移量的形式相匹配(至少在一些实现中),但纯粹主义者会争辩说它无法计算(在那里,被攻击)。@ThomasDickey,是的,这是实现的偏移量。我在很多平台上都看到过,效果很好。我不明白为什么说这是意外行为,“意外”和“未定义”是不同的。回到问题:前面讨论的人中没有一个人能够提供有用的信息。从技术上讲,这是未定义的行为,但是任何体面的编译器都能够在编译过程中解析表达式,因此不会发生空指针访问。实际上,它并不是反引用指针null aka 0。它获取放置在地址0上的
struct a_uu
类型变量中的
b
字段的地址。因此,它在
结构a中获得
b
的偏移量。它恰好与
偏移量的形式相匹配(至少在一些实现中),但纯粹主义者会争辩说它无法计算(在那里,被攻击)。@ThomasDickey,是的,这是实现的偏移量。我在很多平台上都看到过,效果很好。我不明白为什么说这是意外行为,“意外”和“未定义”是不同的。回到问题上来:在之前的讨论中,没有一个人能够提供有用的信息。无法理解标准中的内容。您能详细说明一下吗?标准中的引用似乎与对标准的评论无关,也与实际问题无关。@ThomasDickey同意,我找不到确切的引用,我暂时将其删除无法理解标准中的说明。您能详细说明一下吗?标准中的引用似乎与对标准的评论无关,也与实际问题无关。@ThomasDickey同意,我找不到确切的引用,我现在删除它