含字符数组与int的结构体内存对齐(padding)及大小计算疑问
结构体内存存储与sizeof计算解析
一、结构体sizeof结果为28的原因
默认情况下,C语言结构体遵循内存对齐规则,通常以结构体中最大基本数据类型的大小作为对齐单位(这里int占4字节,对齐单位为4字节)。一步步拆解example4的内存分配:
成员
char a[10]:
字符数组占10字节,但为了满足后续int类型的对齐要求,需要在数组末尾补充2字节填充(padding),使这部分总占用12字节(12是大于等于10的最小4的倍数)。成员
int c:int类型占4字节,直接接在填充后的内存后,此时累计占用12 + 4 = 16字节,刚好是4的倍数,无需额外填充。成员
char b[10]:
字符数组占10字节,累计占用16 + 10 = 26字节。但结构体整体需要对齐到4字节的倍数,因此在末尾补充2字节填充,最终总大小为28字节。
二、printf语句无法工作的原因
你的代码存在两个关键问题:
- 错误使用结构体类型而非变量:
example4是结构体类型名,不是实际变量,不能直接通过example4.a访问成员。必须先定义结构体变量,比如:example4 obj; // 定义结构体变量 - 冗余的地址打印:
&obj.a和&obj.a[0]指向同一内存地址(数组名本身就是首元素的地址),同理&obj.b和&obj.b[0]也是同一地址,无需重复打印。
修正后的printf语句示例:
example4 obj; printf("%p %p %p\n", (void*)&obj.a, (void*)&obj.c, (void*)&obj.b);
内容的提问来源于stack exchange,提问作者UHL
相关产品推荐
相关产品推荐

