【C语言】宏函数计算结构体元素的相对偏移量

(一)结构体strcut test

struct test
{
    
    
	char a;		//1+3
	int b;		//4
	char c;		//1+3
};

通过结构体的内存对齐 1的原则可以得到该结构体的大小是12
结构体元素的相对0的地址的偏移量分别如下:

  • a 0
  • b 4
  • c 8

(二)宏函数详解

#define OFFSET_STRUCT(structname, element) (int)&(((structname *)0)->element)
  • OFFSET_STRUCT(structname, element)是一个宏函数,有两个参数,第一个参数structname是结构体类型名,第二个参数是结构体的元素。
  • (int)&(((structname *)0)->element)
    (1)给定一个structname* 类型的0地址(强制类型转换)
    (2)用该地址访问成员元素((structname )0)->element
    (3)再给该成员元素取地址(强制转成int*的地址)
    (4)最后结果就是成员元素相对于0地址的相对偏移量

(三)完整代码测试

struct test
{
    
    
	char a;
	int b;
	char c;
};

#define OFFSET_STRUCT(structname, element) (int)&(((structname *)0)->element)


int main()
{
    
    
	printf("%d\n", OFFSET_STRUCT(struct test, a));
	printf("%d\n", OFFSET_STRUCT(struct test, b));
	printf("%d\n", OFFSET_STRUCT(struct test, c));
	return 0;
}

(四)测试结果

在这里插入图片描述


  1. 内存对齐的原则https://blog.csdn.net/xiaoxiaoguailou/article/details/120909250 ↩︎

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/121314312