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

一般情况下,如果想知道结构体成员的内存占用情况需要:
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;}
-
内存
+关注
关注
9文章
3173浏览量
76115 -
源码
+关注
关注
8文章
682浏览量
31091 -
结构体
+关注
关注
1文章
131浏览量
11300
发布评论请先 登录
为什么不建议用匿名结构体
网络接口:数字世界的“门铃”,你了解多少?
飞凌嵌入式ElfBoard-文件I/O的了解探究之Linux系统的文件管理机制
网络通讯的结构及地址
C语言结构体使用
WiFi7前端模块(FEM):线性与非线性,你真的了解它们的区别吗?
干扰可以提高测量精度,是真的吗?
一体化超声波清洗机是否真的比传统清洗方法更高效?
定义IO初始化结构体
渗压计在混凝土结构体中的安装指南
CY7C65215A调用了CyReadDeviceConfig和CyWriteDeviceConfig,但数据的字节格式却不透明/没有记录,为什么?
充电接口你真的了解吗?
C语言中结构体与联合体的深度解析:内存布局与应用场景
采购GUTOR UPS备品备件,隐藏的“雷区” 你了解吗?
你真的了解M12接头A和D吗?选型前必知的区别要点

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