MST

星途 面试题库

面试题:C语言结构体嵌套的内存对齐问题

假设有两个结构体,struct A { int a; char b; }; struct B { struct A inner; double c; }; 请分析结构体B的内存布局,并计算其大小,同时说明内存对齐的规则在结构体嵌套场景下是如何应用的。
38.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 结构体B的内存布局分析及大小计算
    • 结构体A:
      • int a 通常占用4个字节。
      • char b 占用1个字节。由于内存对齐规则,char b 后面会填充3个字节,使得结构体A的大小为8个字节(4 + 1 + 3),这里是按照int类型的对齐模数(4字节)进行对齐。
    • 结构体B:
      • struct A inner 占用8个字节。
      • double c 占用8个字节。
      • 结构体B的大小为16个字节(8 + 8),因为结构体B整体按照最大成员(double,8字节)的对齐模数进行对齐。
  2. 内存对齐规则在结构体嵌套场景下的应用
    • 基本规则
      • 结构体的成员变量在内存中按照声明顺序存储,但会按照一定的对齐模数进行对齐。每个成员的偏移量必须是其自身大小的整数倍。例如,int 类型成员的偏移量必须是4的倍数,double 类型成员的偏移量必须是8的倍数等。
      • 结构体的大小必须是其最大成员大小的整数倍。
    • 在结构体嵌套场景下
      • 对于结构体B中的结构体A,结构体A内部先按照自身的对齐规则进行内存布局和大小计算。
      • 然后结构体B将结构体A作为一个整体成员,按照结构体B自身的对齐规则(以最大成员double的大小8字节为对齐模数)来确定结构体A的偏移量和结构体B的整体大小。所以结构体A的起始地址是8的倍数(这里刚好结构体A大小也是8字节,满足条件),double c 的起始地址也是8的倍数,结构体B的大小为16字节,是8的倍数。

综上所述,结构体B的大小为16字节。