C语言offsetof简介
2022年8月29日
有如下C程序
#include <stdio.h>
#include <stdlib.h>
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
typedef struct mem {
char a;
int b;
} __attribute__((packed)) mem_t;
int main()
{
mem_t * tmp = calloc(1, sizeof(mem_t));
printf("%ld\n", sizeof(mem_t));
printf("%ld\n", offsetof(mem_t, b));
}
最后我们可以输出
5
1
可以知道,成员变量b的偏移量是1,为char的大小。(此处的attribute为避免最大化的字节对齐,这里为4字节,如果无这个attribute的话,那么b的偏移量为4)
在offsetof的define中,我参考了
https://stackoverflow.com/questions/18554721/how-to-understand-size-t-type-0-member
也就是说,在这里,0其实是一个地址,表示data segment的开始,可以将0到后面的一段空间视为一个union,虽然我们使用了,但是我们并未修改其中的数据,所以是安全的,同样,我们也可以将其修改为
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)111)->MEMBER - 111)
Previous