C语言Union内存分配解析:为何共用体大小为8字节?
共用体内存分配问题解答
问题重现
代码:
#include <stdio.h> #include <stdint.h> union myUnion { struct { uint8_t a1; uint8_t b1; uint8_t c1; uint8_t d1; uint8_t e1; } abc; int a; }; int main() { printf("size:%ld\n", sizeof(union myUnion)); return 0; }
输出:size:8
疑问:结构体含5个uint8_t成员共5字节,int成员为4字节,为何共用体大小不是9而是8?
核心原因:共用体大小规则 + 内存对齐
共用体的内存分配遵循两个核心规则:
- 大小取成员对齐后最大占用空间:共用体的大小必须能容纳所有成员中,对齐后占用空间最大的那个,而非简单取成员自身
sizeof值的最大值。 - 整体对齐到最严格的对齐模数:共用体本身的起始地址和总大小,必须满足其所有成员中最严格的内存对齐要求。
具体到你的代码:
- 结构体
abc的实际占用:虽然5个uint8_t总字节数是5,但你的环境中int的对齐模数为4字节(大部分32/64位系统的默认规则),共用体的对齐要求会传递给内部结构体。为了满足4字节对齐,结构体需要填充3个字节,最终占用8字节(5的下一个4的倍数)。 int成员a的占用:sizeof(int)为4字节,对齐模数4字节,自身占用4字节。- 共用体需要容纳对齐后最大的成员(即结构体的8字节),同时整体满足4字节对齐,所以最终大小为8字节。
验证方法
你可以打印结构体自身的大小来确认:
printf("struct size:%ld\n", sizeof(union myUnion.abc));
在你的环境中,这个输出会是8而非5,直接证明结构体被填充了字节以满足对齐要求。
内容的提问来源于stack exchange,提问作者Shankarajith M
相关产品推荐
相关产品推荐

