C语言好难——结构体的内存分配

本文探讨了C语言中结构体的内存分配规则,尤其是内存对齐的概念。通过实例分析,解释了编译器如何根据最大数据类型分配内存,并展示了不同结构体布局对内存占用的影响。建议在编写C语言代码时,考虑数据类型排列以优化内存使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体的内存分配,我个人是觉得比较蛋疼的,它有一个需要遵循的原则,地址对齐,也有人称为内存对齐,叫法没关系,反正我只是“拿来”,会用就行。

       好了,先有这么一个概念,什么是内存对齐,先丢一边。……~(~o ̄▽ ̄)~o 。。。滚来滚去……o~(_△_o~) ~。。

      

       设char占用1个字节,int占用4个字节。

       那么问题1

      

struct A

{

       char a;

       int a0;

}ma;

 

char a1;

a1 = sizeof(ma);

 

下面是在keil中仿真的结果


 

?_?,为什么是8???,不是5?

是的,不是5,在编译器里面,为了非连续变量取得的地址能整除于结构体的基地址(结构体的分配的基地址也需要满足可以整除于所占用的内存的最大数据类型的字节数,这句话好绕啊_(:3」∠)_),偏移地址需要对齐。就是说在给变量分配的时候,如果不是连续定义的变量,直接分配一个最大的内存空间,即使我给a0变量定义的是一个char型变量,编译器依旧给其分配了4个字节。

关于偏移地址对齐的说法,我个人倾向于同意的说法是,在给结构体分配内存空间时,如果变量地址不连续(注意这句话,很重要),编译器宁可取结构体中内存占用最大的元素为每个变量分配内存,不够的空间予以补足,只是调用的时候不用而已。

下面结合*.map文件分析一下各个变量的内存分配

    ma                                       0x2000002c   Data           8  main.o(.data)
    a2                                       0x20000034   Data           1  main.o(.data)
    a3               &nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值