You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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值的最大值。
  • 整体对齐到最严格的对齐模数:共用体本身的起始地址和总大小,必须满足其所有成员中最严格的内存对齐要求。

具体到你的代码:

  1. 结构体abc的实际占用:虽然5个uint8_t总字节数是5,但你的环境中int的对齐模数为4字节(大部分32/64位系统的默认规则),共用体的对齐要求会传递给内部结构体。为了满足4字节对齐,结构体需要填充3个字节,最终占用8字节(5的下一个4的倍数)。
  2. int成员a的占用:sizeof(int)为4字节,对齐模数4字节,自身占用4字节。
  3. 共用体需要容纳对齐后最大的成员(即结构体的8字节),同时整体满足4字节对齐,所以最终大小为8字节。

验证方法

你可以打印结构体自身的大小来确认:

printf("struct size:%ld\n", sizeof(union myUnion.abc));

在你的环境中,这个输出会是8而非5,直接证明结构体被填充了字节以满足对齐要求。

内容的提问来源于stack exchange,提问作者Shankarajith M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:57:08