MST

星途 面试题库

面试题:C语言联合体与结构体嵌套时的内存分析

给定以下C语言代码: ```c struct Inner { char a; int b; }; union Outer { struct Inner s; char arr[sizeof(struct Inner)]; }; ``` 1. 计算`struct Inner`的大小,并解释内存对齐的原理如何影响其大小。 2. 计算`union Outer`的大小,并阐述联合体成员共享内存对其大小的影响。 3. 如果修改`struct Inner`中成员的顺序为`int b; char a;`,`struct Inner`和`union Outer`的大小会如何变化,为什么?
15.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 计算struct Inner的大小,并解释内存对齐的原理如何影响其大小
    • struct Inner的大小:在常见的32位或64位系统中,char类型占1字节,int类型通常占4字节。由于内存对齐的原则,结构体的成员存储地址需要是其自身大小的整数倍。char a占1字节,int b占4字节,为了满足int b的内存对齐要求(其地址要是4的倍数),a后面会填充3字节,所以struct Inner的大小为1 + 3 + 4 = 8字节。
  2. 计算union Outer的大小,并阐述联合体成员共享内存对其大小的影响
    • union Outer的大小:联合体的大小是其最大成员的大小。在union Outer中,struct Inner s大小为8字节,char arr[sizeof(struct Inner)]大小也是8字节,所以union Outer的大小为8字节。联合体成员共享内存,其大小取决于最大成员,这样设计是为了保证所有成员都能在共享的内存空间中正确存储。
  3. 如果修改struct Inner中成员的顺序为int b; char a;struct Innerunion Outer的大小会如何变化,为什么
    • struct Inner的大小:int b占4字节,char a占1字节,ab之后,无需额外填充,所以struct Inner的大小为4 + 1 = 5字节。由于内存对齐要求结构体大小为其最大成员大小的整数倍,所以struct Inner最终大小为8字节(int类型大小4字节的2倍)。
    • union Outer的大小:union Outer的大小取决于其最大成员,此时struct Inner s大小为8字节,char arr[sizeof(struct Inner)]大小也是8字节,所以union Outer的大小仍为8字节。