你是否真的了解结构体占用了多少字节?

描述

 

结构体成员所占内存空间大小

源码

一般情况下,如果想知道结构体成员的内存占用情况需要:

1、先用结构体在内存中开空间

2、使用sizeof(结构体变量.成员名)或者sizeof(结构体指针->成员名)的形式获取成员在内存中所占空间大小,举例如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include#include
typedef struct{ int id; char ch;}data;
int main(){ data a; // 结构体变量 data *p = (data *)malloc(sizeof(data));
// 结构体变量用点语法 printf("方式一:成员id大小:%d,ch大小:%d\n", sizeof(a.id),sizeof(a.ch));
// 结构体指针用 -> printf("方式二:成员id大小:%d,ch大小:%d\n", sizeof(p->id),sizeof(p->ch)); 
return 0;}

此方法需要在内存中开辟空间。

 

源码

在阅读源码的时候偶然发现了一种非常妙的写法:可以将结构体指针强制指向地址为0的区域,然后直接用sizeof访问成员。

  •  
  •  

printf("方法三:成员id大小:%d,ch大小:%d\n", sizeof(((data *)0)->id),sizeof(((data *)0)->ch));

地址为0的区域为保留区,程序运行时并不会真正在内存中开空间,这里可以理解为借用了0值。

 

 

为了通用,可以将这种方法进行宏定义:

  •  

#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)

Struct --- 结构体类型名字

Attribute --- 结构体成员名测试代码如下,你也快去试一下吧!

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

#include#include
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
typedef struct{ int id; char ch;}data;
typedef struct{ double d; short m;}data2;
int main(){ printf("%d\n",size_of_attribute(data,ch)); printf("%d\n",size_of_attribute(data2,d)); return 0;}
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分