为何sizeof返回8字节?C语言结构体内存对齐问题咨询
为什么包含int和char的结构体sizeof结果是8而非5?
这是内存对齐导致的——C语言编译器会自动给结构体添加填充字节,目的是让CPU能更高效地访问内存。
具体来说:
- 多数CPU访问内存时是按固定“块大小”(比如32位系统通常是4字节,64位系统可能是8字节)来读取的。如果数据没有对齐到这个块大小,CPU需要分多次读取再拼接数据,效率会大幅降低。
- 你的结构体里最大的成员是
int(占4字节),所以编译器会按照4字节的规则来对齐整个结构体。int num占4字节,char ch占1字节,加起来是5字节,但为了凑够4字节的整数倍,编译器会在ch后面自动填充3个空字节,最终结构体总大小就变成了8字节。
你可以打印成员地址验证这个布局:
struct test t; printf("num的地址: %p\nch的地址: %p\n结构体整体地址: %p\n", &t.num, &t.ch, &t);
会看到ch的地址比num大4,而结构体结束的位置比ch大4(包含3字节填充)。
如果一定要让结构体大小是5字节,可以用编译器特定的指令取消对齐(不推荐,可能导致性能下降,甚至在某些平台无法运行),比如GCC下可以加__attribute__((packed)):
struct test __attribute__((packed)) { int num; char ch; };
这时候sizeof(struct test)就会返回5,但要注意这种写法不具备跨编译器的兼容性。
内容的提问来源于stack exchange,提问作者UnitedKingdom
相关产品推荐
相关产品推荐

