MST

星途 面试题库

面试题:C语言结构体对齐复杂场景分析

假设有两个结构体,struct S1 { char a; int b; }; struct S2 { S1 s1; char c; }; 请说明S2的内存布局和总大小,并阐述原因。同时,如果通过#pragma pack(n)指令改变对齐方式,n取值不同时(假设为1、2、4),S2的内存布局和大小又会如何变化?
43.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 默认对齐方式下
    • 内存布局
      • struct S1中,char a占1字节,int b占4字节。由于默认对齐方式下,int类型按4字节对齐,char a后会填充3字节,所以struct S1大小为8字节。
      • struct S2中,s1占8字节,char c占1字节。char c后会填充3字节,以满足struct S2整体按4字节对齐。
    • 总大小struct S2总大小为12字节。原因是结构体的对齐原则,结构体的大小必须是其最大成员对齐数的整数倍,struct S2中最大成员类型为int,对齐数为4,所以总大小为12字节。
  2. #pragma pack(1)
    • 内存布局
      • struct S1中,char a占1字节,int b占4字节,不再有填充字节,struct S1大小为5字节。
      • struct S2中,s1占5字节,char c占1字节,无填充字节。
    • 总大小struct S2总大小为6字节。因为#pragma pack(1)取消了对齐优化,结构体成员紧密排列,总大小为各成员大小之和。
  3. #pragma pack(2)
    • 内存布局
      • struct S1中,char a占1字节,int b占4字节。char a后填充1字节,struct S1大小为6字节。
      • struct S2中,s1占6字节,char c占1字节,char c后填充1字节,以满足struct S2整体按2字节对齐。
    • 总大小struct S2总大小为8字节。因为最大对齐数为2,结构体大小需为2的整数倍。
  4. #pragma pack(4)
    • 内存布局
      • 与默认对齐方式下struct S1内存布局相同,struct S1大小为8字节。
      • struct S2中,s1占8字节,char c占1字节,char c后填充3字节,以满足struct S2整体按4字节对齐。
    • 总大小struct S2总大小为12字节。因为最大对齐数为4,结构体大小需为4的整数倍,和默认对齐方式下大小一致。