

这是因为结构体内存对齐的原因, 两个int 是8个字节, 一个char是 1 个字节, 这个结构体按道理说是 9 个字节, 但实际上是 12 , 这就涉及到了内存对齐的原因, 我的编译器是 MinGw-64 , 默认对齐是4个字节, 也就是说不到四个字节的会自动补齐到四个字节
详情见附文
原本觉的c语言学的还不错,今天看了一下c语言的有关书籍,看到求结构体大小的例子,心想这不是很简单吗,不就是把所有成员的大小加起来就行了,其实远没我想的简单,看来c语言还要继续学习哈哈。
先看一个实例
typedef struct
{
char c;
int b;
short d;
}A;
这个结构体的大小是多少了,我做的是char占1字节,int占4字节,short占2字节,1 + 4 + 2 = 7. 总共占7字节。哈哈完全错误。
正确结果
12
为什么是12呢?不急我们在看一个实例
typedef struct
{
char c;
short d;
int b;
}B;
这个大小又是多少呢,相信细心的你一定会问,这和上个结构体不是一样的吗,只是在定义的时候把 int b; 和 short d; 对调了一下。应该结果和上个一样吧。当初我也是这样想的,结果哈哈又错了。
正确答案
8
这是为什么呢,相信你们已经迫不及待想知道答案了吧。那我们就来一一揭晓啦。
这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。
在C99标准中,对于内存对齐的细节没有作过多的描述,具体的实现交由编译器去处理,所以在不同的编译环境下,内存对齐可能略有不同,但是对齐的最基本原则是一致的,对于结构体的字节对齐主要有下面两点:
-
结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整 数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟空间时,首先检查预开辟空间的地址相对于结构体首地址的偏移量是否为对齐参数的整数倍,若是,则存放该成员;若不是,则填充若干

本文探讨了C/C++中结构体内存对齐的概念,解释了为何结构体大小并非简单成员大小之和。通过实例分析,解释了编译器如何根据对齐规则调整结构体成员的位置和填充字节,以及#pragma pack(n)对结构体大小的影响。
最低0.47元/天 解锁文章
4479

被折叠的 条评论
为什么被折叠?



