使用null的struct de reference

时间:2014-09-14 19:20:13

标签: c

int main()
{
    typedef struct name
    {
        long a;
        int b;
        long c;
    } r;
    r re = { 3, 7, 5 };

    printf("%d", ((unsigned int)&(( struct name *)0)->b));

    printf("%d", ((int)&((struct name *)0)->a));

    while(1);
}

我发现程序给出了结构成员的偏移量。所以,可能类似于offsetof()。但是,这是我第一次看到'0'的类型转换。这是什么意思?

1 个答案:

答案 0 :(得分:3)

是的,这是尝试实施offsetof。他们将结构指针的开头设置为0,这样b的地址就会指示其偏移量。

然而,这不是好代码。首先,取消引用空指针(与->b一样)是未定义的行为,即使除了指向它之外没有对该值进行任何操作。其次(这是它变得奇怪的地方),空指针 - 尽管被写成0 - 并不保证实际上在内存中的位置0,因此结果转换为int不一定是偏移量会员。

如果某些标准库实现旨在与愿意处理这些违反标准的问但是,您不应该在自己的代码中依赖它。这是offsetof的用途。