【问题标题】:Why is this code able to access a null pointer without causing a crash?为什么这段代码能够访问空指针而不会导致崩溃?
【发布时间】:2015-07-04 18:46:54
【问题描述】:

我遇到了以下代码,它可以找到结构中成员的偏移量。但是我无法弄清楚为什么它不会崩溃,即使它试图取消引用一个 NULL 指针

struct a_
{
    int a;
    int b;
};

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

Output = 4

【问题讨论】:

  • 从技术上讲,这是未定义的行为,但是任何体面的编译器都能够在编译期间解析表达式,因此不会发生空指针访问。
  • 实际上它并没有取消引用指针 NULL aka 0。它在地址 0 上的 struct a_ 类型的变量中获取字段 b 的地址。因此它获得的偏移量b in struct a_
  • 它恰好与offsetof 的形式匹配(至少在某些实现中),但纯粹主义者会争辩说它无法计算(去过那里,被攻击过)。
  • @ThomasDickey,是的,这是一个 offsetof 实现。我在许多平台上都看到过,而且效果很好。我无法理解为什么它被称为意外行为。
  • “意外”和“未定义”是不同的。回到问题:之前讨论的人都无法提供有用的信息。

标签: c pointers crash null-pointer


【解决方案1】:

但是我无法弄清楚为什么它不会崩溃,即使它试图取消引用一个 NULL 指针。

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

【讨论】:

  • 无法理解标准规定的内容。你能详细说明一下吗
  • 标准中的引用似乎与关于标准的评论无关,也与实际问题无关。
  • @ThomasDickey 同意,我找不到确切的报价,我现在删除它
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 2014-10-05
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多