详解详解C语言的结构体中成员变量偏移问题语言的结构体中成员变量偏移问题
主要介绍了C语言的结构体中成员变量偏移问题,以讲解如何编写宏来对成员变量进行修改为主,需要的朋友可以
参考下
c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法
原则有三个:
a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0,
例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要“首部填充”;以此类推
b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行“末尾填充”;
c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须为B中所含成员数据长度最大值的整数倍,
如若B中成员为int,double,char,则B的偏移量要为8的整数倍;否则进行“中间填充”。
相信大家在c语言程序开发的过程一定都使用过结构体,那么不知你对结构体中成员变量偏移这块是如何理解的?本文将和大
家一起分享下,本人最近关于c语言中结构体偏移的一些思考和总结。
示例示例1
我们先来定义一下需求:
已知结构体类型定义如下:
struct node_t{
char a;
int b;
int c;
};
且结构体1Byte对齐
#pragma pack(1)
求:
结构体struct node_t中成员变量c的偏移。
注:这里的偏移量指的是相对于结构体起始位置的偏移量。
看到这个问题的时候,我相信不同的人脑中浮现的解决方法可能会有所差异,下面我们分析以下几种可能的解法:
方法方法1
如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是offsetof函数(其实只是个宏而已,先姑且这样叫着吧),我
们man 3 offsetof查看函数原型如下:
#include <stddef.h>
size_t offsetof(type, member);
有了上述的库函数,我们用一行代码就可以搞定:
offsetof(struct node_t, c);
当然这并非本文探讨的重点,请继续阅读。
方法方法2
当我们对c语言的库函数不熟悉的时候,此时也不要着急,我们依然可以使用我们自己的方法来解决问题。
最直接的思路是:【结构体成员变量c的地址】 减去 【结构体起始地址】
我们先来定义一个结构体变量node:
struct node_t node;
接着来计算成员变量c的偏移量: