ios 结构体大小端转换_这种求结构体成员大小的方法你可能没掌握

在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小。求某结构体中某成员的大小,你会怎么做?

例子:

typedef struct{    char a;      char c;     short b;             int d;    char e;}test_struct;

求 d 成员所占内存空间的大小。

方法一

萌新尝试法。。。

我们可以先定义一个结构体变量,然后再使用sizeof求出。

#include typedef struct{    char a;      char c;     short b;             int d;    char e;}test_struct;​int main(void){    test_struct test_s;      printf("sizeof(test_s.d) = %d", sizeof(test_s.d));    return 0;}

运行结果:

2ccabec009bec30590d26a4761e3db07.png

但是我们为了得到一个成员的大小,而专门定义一个结构体变量,而这个变量也没有其它的用途,有点浪费资源,或者说这种方法low了。

方法二

肉眼观察法。。。。。。

比如在32bit环境下,我们一眼看出d是int类型,就是4个字节,使用sizeof(int)求出。然后想咋用就咋用。这个简单就不讨论了。

方法三

装逼法。。。。。。

代码:

#include ​typedef struct{    char a;      char c;     short b;             int d;    char e;}test_struct;​int main(void){     printf("sizeof(((test_struct*)0)->d) = %d", sizeof(((test_struct*)0)->d));    printf("sizeof(((test_struct*)0)->a) = %d", sizeof(((test_struct*)0)->a));    printf("sizeof(((test_struct*)0)->b) = %d", sizeof(((test_struct*)0)->b));    printf("sizeof(((test_struct*)0)->c) = %d", sizeof(((test_struct*)0)->c));    return 0;}

运行结果:

ffee8705dc9b7b34e1430a22b0941788.png

类似((test_struct*)0)->d这样的用法是个固定用法,把0地址转换为test_struct结构的指针,对于结构体指针,使用->符号就是取其成员,再使用sizeof就可以求得其大小。这里不一定是0地址,其它地址也可以,但一般都会使用0地址。这种方法较方法一的好处就是不用定义一个多余的变量。

这种方法很重要,需要掌握,可能你平时编程不会使用这种方法,但这种方法很重要。在很多优秀的代码中会出现类似形式的宏代码,例如:

上例可封装一个宏定义:

#define  MEM_SIZE(type, member)   sizeof(((type*)0)->member)

求某成员在结构体中的偏移量:

#define  OFFSETOF(type, member)  ( (size_t)( &( ( (type*)0 )->member ) ) )

求结构体偏移量在C语言头文件中stddef.h也有提供,使用方法如:

#include #include ​#define  OFFSETOF(type, member)  ( (size_t)( &( ( (type*)0 )->member ) ) )​typedef struct{    char a;      char c;     short b;             int d;    char e;}test_struct;​int main(void){       /* stddef.h宏 */    printf("offset(a): %d", offsetof(test_struct, a));    printf("offset(c): %d", offsetof(test_struct, c));    printf("offset(b): %d", offsetof(test_struct, b));    printf("offset(d): %d", offsetof(test_struct, d));    printf("offset(e): %d", offsetof(test_struct, e));        /* 自定义宏 */    printf("OFFSETOF(a): %d", OFFSETOF(test_struct, a));    printf("OFFSETOF(c): %d", OFFSETOF(test_struct, c));    printf("OFFSETOF(b): %d", OFFSETOF(test_struct, b));    printf("OFFSETOF(d): %d", OFFSETOF(test_struct, d));    printf("OFFSETOF(e): %d", OFFSETOF(test_struct, e));        return 0;   }

运行结果:

bbb649a3545749c95c7a0c017aca9eb9.png

使用这个求结构体偏移量的宏我们就可以很好地知道结构体成员的在内存中的存储情况。关于结构体内存对齐,可移步至往期笔记:经典、易错的结构体内存对齐问题

以上就是本次分享的求结构体成员的三种方法。重点掌握方法三,因为在很多优秀的代码中都有使用到类似的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值