MST

星途 面试题库

面试题:C语言内存对齐规则及结构体示例

请简述C语言内存对齐的基本规则,并给出一个包含不同数据类型成员的结构体示例,计算该结构体在32位和64位平台下的大小,并说明原因。
46.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

C语言内存对齐基本规则

  1. 数据成员对齐规则:结构体的每个数据成员,都要按照其自身的对齐模数(alignment modulus)进行对齐。对齐模数一般是数据成员自身大小和默认对齐值(通常由编译器决定,32位平台默认值常为4字节,64位平台默认值常为8字节)中的较小值。例如,一个char类型(1字节)数据成员,其对齐模数为1字节;一个int类型(通常4字节)数据成员,在32位平台对齐模数为4字节,在64位平台,若默认对齐值为8字节,则其对齐模数为4字节。
  2. 结构体整体对齐规则:结构体本身也有一个对齐模数,它是结构体中最大数据成员的对齐模数。结构体的大小必须是其对齐模数的整数倍。

结构体示例及大小计算

#include <stdio.h>

// 定义结构体
struct MyStruct {
    char a;
    int b;
    short c;
};
  1. 32位平台
    • char a:1字节,对齐模数为1字节。
    • int b:4字节,对齐模数为4字节。a后面需要填充3字节,使得b从4的倍数地址开始。
    • short c:2字节,对齐模数为2字节。b占用4字节后,c从4 + 4 = 8字节处开始。c占用2字节,此时结构体大小为10字节。
    • 结构体整体对齐模数为4字节(int的对齐模数最大),10不是4的整数倍,需要填充2字节,所以结构体大小为12字节。
  2. 64位平台
    • char a:1字节,对齐模数为1字节。
    • int b:4字节,对齐模数为4字节。a后面需要填充3字节,使得b从4的倍数地址开始。
    • short c:2字节,对齐模数为2字节。b占用4字节后,c从4 + 4 = 8字节处开始。c占用2字节,此时结构体大小为10字节。
    • 结构体整体对齐模数为4字节(int的对齐模数最大),10不是4的整数倍,需要填充2字节,所以结构体大小同样为12字节。

综上所述,在32位和64位平台下,该结构体MyStruct的大小均为12字节。原因是根据内存对齐规则,结构体成员按各自对齐模数对齐,结构体整体按最大成员对齐模数的整数倍计算大小,通过填充字节来满足这些规则。