通过将 NULL 转换为结构指针来确定结构成员的偏移量

Som*_*ame 0 c struct pointers language-lawyer

考虑以下代码:

#include <inttypes.h>

struct test {
    int a;
    long b;
};

int main(void){
    intptr_t ptr = (intptr_t) &(((struct test *)NULL)->b);
    printf("%"PRIiPTR"\n", ptr); //prints 8
    //...
}
Run Code Online (Sandbox Code Playgroud)

我已经使用这种结构很长一段时间来确定结构成员的偏移量,但现在质疑这种结构是否从标准的角度得到了明确的定义。

我不清楚的是为什么在NULL稍后获取地址的指针上执行间接寻址是合法的?

dbu*_*ush 5

不是有效的代码,因为它取消引用 NULL 指针并尝试获取不存在的对象的左值。

有一种语言构造可以给出结构成员的偏移量,即offsetof宏。

尽管这样的宏可能会扩展为与您所拥有的类似的表达式,但该宏被视为实现的一部分,并且此类代码可以执行“用户”代码不允许执行的操作