【发布时间】: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的地址。因此它获得的偏移量binstruct a_ -
它恰好与
offsetof的形式匹配(至少在某些实现中),但纯粹主义者会争辩说它无法计算(去过那里,被攻击过)。 -
@ThomasDickey,是的,这是一个 offsetof 实现。我在许多平台上都看到过,而且效果很好。我无法理解为什么它被称为意外行为。
-
“意外”和“未定义”是不同的。回到问题:之前讨论的人都无法提供有用的信息。
标签: c pointers crash null-pointer