我已经定义了一个宏来计算结构到任何结构字段的偏移量。代码如下:
#define offset(struct_name, fld_name) \
(unsigned int)&(((struct_name *)0)->fld_name)
typedef struct emp_{
char name[20];
unsigned int salary;
char designation[30];
unsigned int emp_id;
} emp_t;
int main(int argc, char **argv){
unsigned int offsetValue;
offsetValue=offset(emp_t,salary);
printf("field = %s\n","salary");
printf("offset = %d\n", offsetValue);
return 0;
}
如果我编译并运行代码,字段“salary”的偏移量为 20,它应该是 20。但是如果我将结构字段更改char name[20];
为char name[30];
“salary”的偏移量,则更改为 32,但它应该是 30。如果我进一步更改结构字段将char name[1];
“工资”的偏移更改为 4,但它应该是 1。为什么会发生这些偏移值差异?
问题的第二部分是宏究竟是如何#define offset
计算偏移量的?&(((struct_name *)0)->fld_name)
实际在做什么?外部&
表示地址,但剩下的到底是什么(((struct_name *)0)->fld_name)
意思?