MST

星途 面试题库

面试题:C语言结构体中成员对齐规则及应用

请简述C语言结构体成员对齐的规则,并编写一个结构体,使其占用内存空间最小,同时说明如何计算该结构体的大小。
28.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

C语言结构体成员对齐规则

  1. 第一个成员:结构体的第一个成员在其自身大小的整数倍地址处开始存储。例如,一个char类型成员,会从偏移量0处开始存储,因为char大小为1字节,0是1的整数倍。
  2. 后续成员:从一个地址开始存储,该地址是该成员自身大小的整数倍。例如,int类型(假设int为4字节)的成员,存储地址必须是4的整数倍。如果前面成员占用的空间不足,会在前面成员之后填充字节以满足对齐要求。
  3. 结构体整体:结构体的总大小必须是其最大成员大小的整数倍。如果不满足,会在结构体末尾填充字节以达到这个要求。

占用内存空间最小的结构体示例

#include <stdio.h>

// 定义一个结构体,按顺序排列成员以减少填充
struct MinSizeStruct {
    char a;
    short b;
    int c;
};

在此结构体中,char类型的a占1字节,short类型的b需要2字节对齐,因此在a后填充1字节,b从偏移量2处开始,占用2字节,int类型的c需要4字节对齐,从偏移量4处开始,占用4字节。

计算该结构体大小

  1. 成员占用a占用1字节,b占用2字节,c占用4字节。
  2. 填充字节:为了满足b的对齐要求,在a后填充1字节。
  3. 结构体总大小1 + 1(填充)+ 2 + 4 = 8字节。同时,8也是结构体中最大成员int(4字节)的整数倍,满足结构体整体对齐要求。所以该结构体大小为8字节。可以使用sizeof(struct MinSizeStruct)获取其大小。