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

含字符数组与int的结构体内存对齐(padding)及大小计算疑问

结构体内存存储与sizeof计算解析

一、结构体sizeof结果为28的原因

默认情况下,C语言结构体遵循内存对齐规则,通常以结构体中最大基本数据类型的大小作为对齐单位(这里int占4字节,对齐单位为4字节)。一步步拆解example4的内存分配:

  1. 成员char a[10]:
    字符数组占10字节,但为了满足后续int类型的对齐要求,需要在数组末尾补充2字节填充(padding),使这部分总占用12字节(12是大于等于10的最小4的倍数)。

  2. 成员int c:
    int类型占4字节,直接接在填充后的内存后,此时累计占用12 + 4 = 16字节,刚好是4的倍数,无需额外填充。

  3. 成员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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:57:49