0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

信盈达 2024-06-04 08:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

fd536da6-2205-11ef-bd4a-92fbcf53809c.png

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

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;}

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

fd56d5c2-2205-11ef-bd4a-92fbcf53809c.png

在阅读源码的时候偶然发现了一种非常妙的写法:可以将结构体指针强制指向地址为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

    文章

    3234

    浏览量

    76518
  • 源码
    +关注

    关注

    8

    文章

    689

    浏览量

    31514
  • 结构体
    +关注

    关注

    1

    文章

    131

    浏览量

    11413
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    变频器是否真的省电?

    变频器作为一种电力电子设备,在现代工业生产和民用领域中广泛应用,其核心功能是通过调节电机工作频率来实现转速控制。关于“变频器是否真的省电”这一问题,需要从技术原理、应用场景以及实际效果三个维度综合分析,才能得出客观结论。
    的头像 发表于 02-27 17:00 674次阅读

    小艺开放平台快速创建鸿蒙智能

    与预览工具体验当前智能的实际效果,来帮助我们进行智能的问题定位和优化改进。 创建智能时,开场对话可以让用户快速了解的智能
    发表于 01-19 11:00

    10个例子代码,C语言结构的高级

    (\"Flag 3: %dn\", f.flag3); return 0; } 在这个例子中,我们使用了位字段来定义一个结构,其中每个成员变量都指定了所占用的位数。这样
    发表于 01-05 06:32

    一个经典的结构和联合体共用的实例

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,
    发表于 12-16 07:14

    结构声明与定义

    一样,去声明我们的结构体操作,但是C语言中规定,声明结构变量的时候,struct关键字是不可少的。 struct 结构类型名
    发表于 12-11 07:52

    typedef结构使用

    虽然结构的出现能够让我们有一个更科学的数据结构来管理数据,但是每次使用结构都需要struct...,未免显得有些冗长和麻烦。有了type
    发表于 12-08 07:04

    为什么不建议用匿名结构

    说起匿名结构,想必大家第一感觉就是看着好高大上的名字,但实际上也就那样。 typedef struct { union { struct { uint8_t bit_0:1
    发表于 12-04 07:39

    网络接口:数字世界的“门铃”,了解多少?

    插上网线,连接Wi-Fi,可曾想过数据是如何在网络世界穿梭的?今天,让我们一起揭开网络接口的神秘面纱! 是否曾好奇,当我们插上网线或连接Wi-Fi时,数据是如何在网络世界中穿梭的?这一切都离不开
    发表于 11-26 18:53

    网络通讯的结构及地址

    1. 网络地址结构 Socket通过结构描述网络地址,最常用的是IPv4地址结构sockaddr_in(定义在): struct sockaddr_in
    发表于 11-17 07:59

    C语言结构使用

    有时候需要将不同类型的数据组合为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄等属性,如果针对每个属性都单独定义一个变量,那么当有多名学生时变量就难以分清。结构就是用来管理不同类
    发表于 11-12 08:30

    干扰可以提高测量精度,是真的吗?

    一、前言 水可以引燃蜡烛,是真的吗?是真的! 蛇怕雄黄,是真的吗?是假的! 上述两个现象,已经由央视 财经频道《是真的吗?》揭秘。 今天要探讨的是: 干扰可以提高测量精度,是
    的头像 发表于 08-04 09:28 841次阅读
    干扰可以提高测量精度,是<b class='flag-5'>真的</b>吗?

    化超声波清洗机是否真的比传统清洗方法更高效?

    与传统清洗方法的效率对比,并分析其优缺点,以帮助读者更好地了解何时选择哪种清洗方法。目录一化超声波清洗机的工作原理传统清洗方法的概述清洗效率比较成本和可持续性适用
    的头像 发表于 07-28 16:43 703次阅读
    一<b class='flag-5'>体</b>化超声波清洗机<b class='flag-5'>是否</b><b class='flag-5'>真的</b>比传统清洗方法更高效?

    定义IO初始化结构

    由上述IOPORT相关功能的枚举类型我们可以知道,在对IOPORT模块进行初始化时需要根据情况配置它们。因此我们定义一个IOPORT初始化的结构类型IOPORT_Init_t,它的成员包括了由上述所有枚举类型所声明的变量,因此该结构
    的头像 发表于 07-16 16:26 1572次阅读

    渗压计在混凝土结构中的安装指南

    在现代土木工程和岩土工程中,渗压计是监测混凝土结构体内孔隙水压力变化的重要工具。南京峟思公司生产的渗压计因其高精度和可靠性而被广泛应用于各种工程监测项目中。一、渗压计在混凝土结构中的应用价值渗压计
    的头像 发表于 05-28 10:55 736次阅读
    渗压计在混凝土<b class='flag-5'>结构</b><b class='flag-5'>体</b>中的安装指南

    充电接口真的了解吗?

    USB(Universal Serial Bus,通用串行总线)自1994年诞生以来,已成为我们日常生活中不可或缺的接口标准。从键盘、鼠标到手机、充电宝,USB接口无处不在。但知道USB接口也有
    的头像 发表于 05-18 17:39 5406次阅读