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

    文章

    2962

    浏览量

    73796
  • 源码
    +关注

    关注

    8

    文章

    632

    浏览量

    29100
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10822
收藏 人收藏

    评论

    相关推荐

    字节豆包推出AI智能耳机

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

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

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

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

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

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

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

    MCAL的DMA如何使得变量存储由编译器自动分配 ?

    (DMA_START_SEC_CONFIG_DATA_ASIL_B_CORE0_256),但是Dma_kChannel_40_TcsConfigRoot结构实际只占用16个字节,请问
    发表于 02-02 08:33

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,
    的头像 发表于 01-11 18:24 1222次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构可以
    的头像 发表于 01-11 08:00 906次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    keil arm工程中结构1字节对齐如何实现

    在Keil Arm工程中,结构的对齐方式可以通过使用特定的编译器指令或者关键字来实现。结构的对齐方式会直接影响结构
    的头像 发表于 01-05 14:40 3291次阅读

    RFID和NFC之间的那些事儿,真的了解吗?

    RFID和NFC之间的那些事儿,真的了解吗?
    的头像 发表于 12-15 09:38 1196次阅读
    RFID和NFC之间的那些事儿,<b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>吗?

    作为射频工程师,真的会用“dB”?

    作为射频工程师,真的会用“dB”?
    的头像 发表于 12-06 14:51 524次阅读
    作为射频工程师,<b class='flag-5'>你</b><b class='flag-5'>真的</b>会用“dB”?

    真的能区别int(1)和int(10)的应用?

    我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?
    的头像 发表于 12-06 14:43 478次阅读
    <b class='flag-5'>你</b><b class='flag-5'>真的</b>能区别int(1)和int(10)的应用?

    了解PWM“死区”吗?

    了解PWM“死区”吗?
    的头像 发表于 11-24 16:47 915次阅读
    <b class='flag-5'>你</b><b class='flag-5'>了解</b>PWM“死区”吗?

    嵌套的结构 字节是如何对齐的

    嵌套的结构字节又是如何对齐的呢 先来看下面的代码 typedef struct stu1 { char ary [ 5 ] ; int a; }stu1; typedef struct stu2
    的头像 发表于 11-20 16:01 476次阅读
    嵌套的<b class='flag-5'>结构</b><b class='flag-5'>体</b> <b class='flag-5'>字节</b>是如何对齐的

    什么是结构字节对齐现象

    什么是结构字节对齐现象 程序员,咱都用代码说话,先上 code: (说明:以下代码均在 ARM 平台上,使用 Keil 进行编译测试) # define offset_of (TYPE
    的头像 发表于 11-20 15:55 554次阅读
    什么是<b class='flag-5'>结构</b><b class='flag-5'>体</b>的<b class='flag-5'>字节</b>对齐现象

    为什么我定义的结构不能用--&gt;来调用结构的元素?

    结构代码部分 typedef unsigned int uint_32t; typedef unsigned short uint_16t; typedef struct { uint_32t
    发表于 11-11 19:06