直接看代码
#include <stdio.h>
#define DEFINE(sym, val) \
asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val))
#define OFFSET(sym, str, mem) \
DEFINE(sym, offsetof(struct str, mem))
#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
struct test {
int m;
int n;
};
typedef struct ABC {
struct test *t[10];
int a;
int b;
int c;
int d;
} ABC;
int main()
{
ABC *abc;
//printf("d %d \n", offsetof((ABC),(d)));
printf(" a:%d \n", (size_t)&((struct ABC *)0)->a);
printf(" b:%d \n", (size_t)&((struct ABC *)0)->b);
printf(" c:%d \n", (size_t)&((struct ABC *)0)->c);
printf(" d:%d \n", (size_t)&((struct ABC *)0)->d);
return 0;
}
运行在64位机器中结果如下:
$ ./test_offset
a:80
b:84
c:88
d:92
结果分析,指针占8 × 10 个字节,所以a相对与结构体ABC的偏移是80, bcd以此类推。