MST

星途 面试题库

面试题:C语言结构体与联合体复杂内存布局分析

假设有一个结构体 `struct A { char a; int b; short c; }` 和一个联合体 `union B { char a; int b; short c; }`,在32位系统下,字节对齐规则为4字节对齐,分别计算 `struct A` 和 `union B` 的大小,并解释计算过程。如果将结构体 `struct A` 中的成员顺序调整为 `int b; char a; short c;`,其大小又会如何变化,为什么?
11.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 计算 struct A 原始顺序的大小
    • 字节对齐规则为4字节对齐。
    • char a 占1字节,由于要满足4字节对齐,它后面会填充3字节,此时已占用4字节。
    • int b 占4字节,加上前面的4字节,共8字节。
    • short c 占2字节,它后面会填充2字节以满足4字节对齐,此时结构体总大小为8 + 2 + 2 = 12字节。
    • 所以 struct A 原始顺序大小为12字节。
  2. 计算 union B 的大小
    • 联合体的大小是其最大成员的大小。
    • char a 占1字节,int b 占4字节,short c 占2字节,最大的是 int b,占4字节。
    • 所以 union B 的大小为4字节。
  3. 调整 struct A 成员顺序后的大小
    • 成员顺序变为 int b; char a; short c;
    • int b 占4字节。
    • char a 占1字节,short c 占2字节,1 + 2 = 3字节,为满足4字节对齐,后面需填充1字节。
    • 此时结构体总大小为4 + 1 + 2 + 1 = 8字节。
    • 所以调整顺序后 struct A 的大小变为8字节,原因是调整顺序后减少了填充字节,提高了空间利用率。