C语言中关于结构体的内存对齐

本文详细解析了嵌入式C语言中结构体的两种对齐方式:自然对齐与自定义对齐,并通过示例代码展示了不同情况下结构体大小的计算方法。

以前没太总结,今天看飞卡的书偶然看到的一个关于嵌入式C结构体的知识,赶紧来记录下,方便以后忘记了再次查阅。


1、自然对齐

两个原则:


1、各个类型偏移量必须是自身所占字节数的整数倍。
(譬如,int占4字节,它的偏移量也必须是4的倍数)


2、总的大小必须为该结构体中最大内存的整数倍,不够需要补充。

对了,忘了解释这个偏移量的概念了。变量的存放地址相对于结构起始地址的偏移量。

单独谈及概念的话,也许比较难受,那么直接上代码吧。


#include <stdio.h>
#include <stdlib.h>


struct MyStruct
{
    double a;
    char b;
    int c;
}mystruct;

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}

答案: 8+1+3+4= 16

这么加,什么意思呢?

莫急,且听我细细道来。

我不是前面说了两条金科玉律了嘛?比照着来。

第一条,每个类型的偏移量是自身所占字节的整数倍。第一个类型是double,偏移量是0,自身所占字节8。符合条件。
然后就是char,自身所占字节1,偏移量8。符合条件。
接着int,自身所占字节4,偏移量为9的话,不符合4的倍数这个条件。
应空出3个字节,让偏移量为12,此时满足4的倍数。

那么此时对应的结果为:8+1+3+4 = 16

对了,还要验证一下是否符合第二条,满足最终答案是最大字节数的整数倍。故答案就是16咯。


那么接下来再看一个:

#include <stdio.h>
#include <stdlib.h>


struct MyStruct
{
    char b;
    double a;
    int c;
}mystruct;

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}

char和double换了一下位置呢,

答案:1+7+8+4+4 = 24

emmm,,, 也许参照前面的你算出的答案可能是20,为啥还要+4啊,别忘了第二条玉律,必须是8的倍数,只能加4。


2、自定义对齐

使用#pragma pack(n),也是两条规矩:

自身所占字节小于n,按照默认的对齐方式

自身索赞字节大于n,那么偏移量必须是n的整数倍。

还不清楚?没关系,看代码!

#include <stdio.h>
#include <stdlib.h>
#pragma pack(push)
#pragma pack(4)

struct MyStruct
{
    char b;
    double a;
    int c;
}mystruct;
#pragma pack(pop)

int main()
{
    printf("%d\n", sizeof(mystruct));
    return 0;
}

猜,答案会是多少?

答案: 1+3+8+4 = 16

和刚才的24有区别吧,,

学会了吧,,哈哈哈。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值