打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
这种求结构体成员大小的方法你可能还没掌握~

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

求某结构体中某成员的大小,你会怎么做?

例子:

typedef struct
{

 char a;  
 char c; 
 short b;         
 int d;
 char e;
}test_struct;

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

方法一

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

左右滑动查看全部代码>>>

#include <stdio.h>

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\n"sizeof(test_s.d));
 return 0;
}

运行结果:

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

方法二

肉眼观察法。。。。。

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

方法三

装逼法。。。

代码:

左右滑动查看全部代码>>>

#include <stdio.h>

typedef struct
{

 char a;  
 char c; 
 short b;         
 int d;
 char e;
}test_struct;

int main(void)

 printf("sizeof(((test_struct*)0)->d) = %d\n"sizeof(((test_struct*)0)->d));
 printf("sizeof(((test_struct*)0)->a) = %d\n"sizeof(((test_struct*)0)->a));
 printf("sizeof(((test_struct*)0)->b) = %d\n"sizeof(((test_struct*)0)->b));
 printf("sizeof(((test_struct*)0)->c) = %d\n"sizeof(((test_struct*)0)->c));
 return 0;
}

运行结果:

类似((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 <stdio.h>
#include <stddef.h>

#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\n", offsetof(test_struct, a));
 printf("offset(c): %d\n", offsetof(test_struct, c));
 printf("offset(b): %d\n", offsetof(test_struct, b));
 printf("offset(d): %d\n", offsetof(test_struct, d));
 printf("offset(e): %d\n", offsetof(test_struct, e));
 
 /* 自定义宏 */
 printf("OFFSETOF(a): %d\n", OFFSETOF(test_struct, a));
 printf("OFFSETOF(c): %d\n", OFFSETOF(test_struct, c));
 printf("OFFSETOF(b): %d\n", OFFSETOF(test_struct, b));
 printf("OFFSETOF(d): %d\n", OFFSETOF(test_struct, d));
 printf("OFFSETOF(e): %d\n", OFFSETOF(test_struct, e));
 
 return 0
}

运行结果:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C语言结构体对齐
结构体struct和联合体union最全讲解
结构体对齐规则
C语言的那些小秘密之字节对齐
ANSI C中取得结构体字段偏移量的常用方法
结构体(含位域)的sizeof
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服