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

关于C语言结构体填充的疑问:资源、内存分配及结构体大小解析

C语言结构体填充相关问题解答

一、可信学习资源

  • 《C程序设计语言(K&R第二版)》:作为C语言领域的经典权威资料,书中明确讲解了结构体的存储布局与对齐规则。
  • C语言官方标准(如C99、C17):标准文档定义了结构体对齐的底层规则,是最权威的参考依据。
  • 主流编译器官方手册(如GCC、Clang):手册会详细说明编译器对结构体填充的具体实现细节,以及如何通过编译选项调整对齐规则。

二、结构体内存分配方式

结构体是按成员逐个分配内存,但编译器会根据每个成员的对齐要求自动插入填充字节,最终整个结构体的大小会对齐到所有成员中最大的对齐边界。

需要明确:内存页是操作系统层面的内存管理单位(32位机通常4KB,64位机通常4KB或更大,并非4/8字节),和结构体内部的布局计算无关。操作系统分配结构体所在的内存块时会按页对齐,但这是内存块的整体分配行为,不影响结构体内部成员的布局和大小计算。

三、代码示例大小解析

你给出的代码在64位环境下运行得到结构体大小为24,具体拆解如下(遵循64位系统默认对齐规则):

  1. unsigned short Flag:占用2字节,偏移0-1,对齐要求2字节。
  2. char DebounceSamples:占用1字节,偏移2;为满足下一个unsigned short成员的2字节对齐要求,编译器会在偏移3的位置插入1字节填充。
  3. unsigned short Device:占用2字节,从偏移4开始,占用4-5。
  4. 此时已使用6字节,下一个成员char *BufferPtr(64位环境下指针占8字节,对齐要求8字节),需要在偏移6-7的位置插入2字节填充,指针从偏移8开始,占用8-15。
  5. char *OverridePtr:同样占8字节,从偏移16开始,占用16-23。
  6. 整个结构体的最大对齐边界是8字节(指针的对齐要求),总大小24刚好是8的倍数,无需额外填充。最终结构体大小为24字节。

内容的提问来源于stack exchange,提问作者Prashanth Sagar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:20:32