这是因为结构体内存对齐的原因, 两个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)是对齐参数的整 数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟