未分类

C语言offsetof简介

有如下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)

driver3

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注