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;
}
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。