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

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

    关注

    8

    文章

    3052

    浏览量

    74286
  • 源码
    +关注

    关注

    8

    文章

    652

    浏览量

    29433
  • 结构体
    +关注

    关注

    1

    文章

    130

    浏览量

    10870
收藏 人收藏

    评论

    相关推荐

    结构成员的顺序会影响结构的大小吗

    相同的结构成员,如果把顺序调整一下,会不会影响结构的大小? 答案是会的,这主要跟字节对齐有关。 比如这样的
    的头像 发表于 11-25 16:24 263次阅读

    深度了解SiC的晶体结构

    SiC是由硅(Si)和碳(C)按1:1的化学计量比组成的晶体,因其内部结构堆积顺序的不同,形成不同的SiC多型,本篇章带你了解SiC的晶体结构及其可能存在的晶体缺陷。
    的头像 发表于 11-14 14:57 1187次阅读
    深度<b class='flag-5'>了解</b>SiC的晶体<b class='flag-5'>结构</b>

    C语言和C++中结构的区别

    同样是结构,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 351次阅读

    字节豆包推出AI智能耳机

    字节跳动旗下豆包品牌近日推出了其首款AI智能耳机——Ola Friend。这款耳机采用了开放式设计,单耳重量仅为6.6克,佩戴舒适轻盈。
    的头像 发表于 10-10 16:55 623次阅读

    服务器cpu占用率高怎么解决

    服务器CPU占用率高是一个常见的问题,它可能会导致服务器性能下降,甚至影响用户体验。 一、了解服务器CPU占用率高的原因 应用程序问题 应用程序设计不合理,导致CPU占用率高 应用程序
    的头像 发表于 10-10 15:14 1105次阅读

    认识贴片电阻吗,对他了解多少?

    认识贴片电阻吗,对他了解多少?
    的头像 发表于 08-27 15:49 595次阅读
    <b class='flag-5'>你</b>认识贴片电阻吗,<b class='flag-5'>你</b>对他<b class='flag-5'>了解</b>多少?

    【GD32 MCU 入门教程】六、GD32 MCU 选项字节设置及解除方法

    您在使用GD32过程中是否遇到过芯片反复复位,代码无法更新,代码一直执行在0x1fffxxxx区域,或代码执行在SRAM区域的情况?如果有遇到这类现象是否找到原因呢?如果没找到是否检查过选项
    的头像 发表于 08-26 09:43 761次阅读
    【GD32 MCU 入门教程】六、GD32 MCU 选项<b class='flag-5'>字节</b>设置及解除方法

    ota升级的库中,结构upgrade_server_info中pespconn的作用是什么?

    check_cb; struct espconn *pespconn; }; 这个结构中已经有ip,port,pespconn这个结构
    发表于 07-12 06:33

    知道一成型电感多少钱吗

    知道一成型电感多少钱吗 gujing 编辑:谷景电子 一成型电感是电子电路中特别重要的一种零件,大家在选择一成型电感的时候都会比较重视它的价格!一
    的头像 发表于 07-06 10:46 1028次阅读

    真的了解驻波比吗?到底什么是电压驻波比?

    真的了解驻波比吗?到底什么是电压驻波比?在很长一段时间内,小编对驻波比的了解仅限于这样一个概念:它是一个用于描述波反射大小的物理量,取值范围[1, ∞],值越小,就表示反射越小,值越
    的头像 发表于 05-29 14:27 4484次阅读
    <b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>驻波比吗?到底什么是电压驻波比?

    Freertos队列项里的字节长度是否可以获取?

    最近刚学Freertos, 看到可以获取Freertos队列长度,但是队列项里的字节长度是否可以获取? 因为项目中队列中会存放不定长字节,需要对队列中的数据分拣,每次分拣的时候遍历所有队列项长度,有点浪费,请教了
    发表于 04-29 07:17

    真的了解110配线架吗

    110配线架是一种常见的网络设备,主要用于计算机网络中数据和电话传输的配线系统。作为综合布线系统的核心产品,它起着传输信号的灵活转接、灵活分配以及综合统一管理的作用。综合布线系统的最大特性是利用同一接口和同一种传输介质,让各种不同信息在上面传输,而这一特性的实现主要通过连接不同信息的配线架之间的跳接来完成。 110配线架早期主要用于网络系统配线,现在则主要用于电话系统配线,俗称鱼骨架。一般来说,一个110配线架为
    的头像 发表于 04-23 11:46 1755次阅读

    用FreeRTOS使用队列怎么发送一个结构呢?

    怎么使用队列,发送一个12个字节结构呢? osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec
    发表于 04-17 07:35

    C语言结构史上最详细的讲解【软件干货】

    struct结构数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(c99) 等等数据类型,他们可以表示一些事物
    的头像 发表于 03-28 17:52 842次阅读

    PSOC4的PWM输出占用的IO引脚是否可以做普通GPIO口吗?

    PSOC4在设置开启PWM模块应用占用某个IO引脚输出,一段时间后,由于不需要PWM功能,计划关掉PWM模块,让该占用的IO口做普通GPIO使用,是否可以实现?怎么实现?
    发表于 02-05 08:25