C语言-结构体

博客主要介绍了结构体内存对齐原则,即结构体成员大小为m字节时,其地址是m的倍数。以32位单片机为例,分析了结构体大小的计算,指出若分配9字节无法满足结构体数组元素对齐要求,编译器会分配12字节并在末尾填充。还提到编译预处理指令#pragma pack()可使结构体按1字节对齐,此时仿真结果为9。

1、结构体内存对齐

对齐原则:假设结构体成员大小是m字节,其地址是m的倍数。

struct S2
{
    int i;
    int j;
    char c;
};

32位单片机,IAR仿真结果是12
在这里插入图片描述

要正确计算这个结构体的大小,需要这样考虑:创建这个结构体的数组,每个数组元素都会满足它的对齐要求。

如果给这个结构体分配 9 个字节。考虑结构体数组 struct s2 a[4],就不能满足数组 a 的每个元素的对齐要求。假设数组的起始地址为 x,则每个元素的地址分别为 x、x+9、x+18、x+27,有三个元素不满足对齐原则。

由此,编译器会为结构 s2 分配 12 个字节,最后三个字节是补充的空间(浪费的空间),即在结构体的末尾增加填充。

#pragma pack(1)
struct S3
{
    int i;
    int j;
    char c;
}
#pragma pack()

编译预处理指令#pragma pack()使得在这之间定义的结构体按照 1 字节方式对齐。
32位单片机,IAR编译器仿真结果是9
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值