面试题答案
一键面试C语言结构体成员对齐规则
- 第一个成员:结构体的第一个成员在其自身大小的整数倍地址处开始存储。例如,一个
char
类型成员,会从偏移量0处开始存储,因为char
大小为1字节,0是1的整数倍。 - 后续成员:从一个地址开始存储,该地址是该成员自身大小的整数倍。例如,
int
类型(假设int
为4字节)的成员,存储地址必须是4的整数倍。如果前面成员占用的空间不足,会在前面成员之后填充字节以满足对齐要求。 - 结构体整体:结构体的总大小必须是其最大成员大小的整数倍。如果不满足,会在结构体末尾填充字节以达到这个要求。
占用内存空间最小的结构体示例
#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字节。
计算该结构体大小
- 成员占用:
a
占用1字节,b
占用2字节,c
占用4字节。 - 填充字节:为了满足
b
的对齐要求,在a
后填充1字节。 - 结构体总大小:
1 + 1(填充)+ 2 + 4 = 8
字节。同时,8也是结构体中最大成员int
(4字节)的整数倍,满足结构体整体对齐要求。所以该结构体大小为8字节。可以使用sizeof(struct MinSizeStruct)
获取其大小。