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

    文章

    3173

    浏览量

    76115
  • 源码
    +关注

    关注

    8

    文章

    682

    浏览量

    31091
  • 结构体
    +关注

    关注

    1

    文章

    131

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么不建议用匿名结构

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

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

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

    飞凌嵌入式ElfBoard-文件I/O的了解探究之Linux系统的文件管理机制

    叫做inode节点),不同的inode就可以表示不同的文件,每一个文件都必须对应一个inode,inode实质上是一个结构,这个结构中有很多的元素,不同的元素记录了文件的不同信息,
    发表于 11-18 08:50

    网络通讯的结构及地址

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

    C语言结构使用

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

    WiFi7前端模块(FEM):线性与非线性,真的了解它们的区别吗?

    ▲点击☆星标我,以防失联在WiFi7(IEEE802.11be)技术中,经常会听到前端模块(FEM)产品分为线性和非线性两种类型,其核心差异是否了解呢?本文将从性能特点、应用场景等方面详细分析两者
    的头像 发表于 09-10 16:33 8359次阅读
    WiFi7前端模块(FEM):线性与非线性,<b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>它们的区别吗?

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

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

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

    与传统清洗方法的效率对比,并分析其优缺点,以帮助读者更好地了解何时选择哪种清洗方法。目录一化超声波清洗机的工作原理传统清洗方法的概述清洗效率比较成本和可持续性适用
    的头像 发表于 07-28 16:43 385次阅读
    一<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 1107次阅读

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

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

    CY7C65215A调用了CyReadDeviceConfig和CyWriteDeviceConfig,但数据的字节格式却不透明/没有记录,为什么?

    我有另一个帖子中的 Linux 配置工具源代码。 然而,在示例中,它调用了 CyReadDeviceConfig 和 CyWriteDeviceConfig,但数据的字节格式却不透明/没有记录。 这些数据的格式是什么?
    发表于 05-22 06:26

    充电接口真的了解吗?

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

    C语言中结构与联合体的深度解析:内存布局与应用场景

    int value; // 4字节 }; // 写入arr[0]=\'A\'后,value的二进制表示为0x41 三、实战代码深度剖析 3.1 结构应用场景 typedef struct
    发表于 04-08 09:18

    采购GUTOR UPS备品备件,隐藏的“雷区” 了解吗?

    在GUTOR UPS备品备件采购之路上,困难重重,选型、渠道甄别、成本把控、安装部署、售后保障,桩桩件件都是棘手难题。隐藏的“雷区” 了解吗?
    发表于 03-21 16:08

    真的了解M12接头A和D吗?选型前必知的区别要点

    只有深入了解M12接头A和D在各方面的区别,才能在选型时做到精准无误,确保电气连接系统高效、稳定运行。如果在选型过程中还有其他具体问题,欢迎随时与我交流。
    的头像 发表于 01-22 16:00 1099次阅读
    <b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>M12接头A和D吗?选型前必知的区别要点