kernel FIELD_SIZEOF宏 NULL地址不访问不出错

Linux kernel的宏:

#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))

为什么不会segment fault?因为没有访问那个f。一旦有访问,就会segment fault,比如:

#include <stdio.h>

struct a
{
    int f;
};

void test_func(int f)
{
    // printf("f is: %d\n", f);
    return;
}

int main()
{
    test_func(((struct a *)0)->f);
    return 0;
}

这里main里面尝试将f的值取出,make copy,然后传给函数test_func,就会segment fault。

如果是这样:test_func(&(((struct a *)0)->f));

就不会出segment fault,&(((struct a *)0)->f)的值是0。

原文地址:https://www.cnblogs.com/super119/p/2364614.html