C语言中结构体偏移及结构体成员变量访问方式的问题讨论语言中结构体偏移及结构体成员变量访问方式的问题讨论
主要介绍了C语言中结构体偏移及结构体成员变量访问方式的问题讨论,帮助大家理解struct的成员变量偏移,需要
的朋友可以参考下
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的偏移量:
(unsigned long)(&(node.c)) - (unsigned long)(&node)
&(node.c)为结构体成员变量c的地址,并强制转化为unsigned long;
&node为结构体的起始地址,也强制转化为unsigned long;
最后我们将上述两值相减,得到成员变量c的偏移量;
方法3
按照方法2的思路我们在不借助库函数的情况下,依然可以得到成员变量c的偏移量。但作为程序员,我们应该善于思考,是
不是可以针对上面的代码做一些改进,使我们的代码变得更简洁一些?在做具体的改进之前,我们应该分析方法2存在哪些方
面的问题。
相信不用我多说,细心的你一定已经察觉到,方法2中最主要的一个问题是我们自定义了一个结构体变量node,虽然题目中并
未限制我们可以自定义变量,但当我们遇到比较严且题目中不允许自定义变量的时候,此时我们就要思考新的解决方法。