MST

星途 面试题库

面试题:C语言结构体嵌套及内存对齐问题

定义一个结构体A,它包含一个字符数组(长度为3)、一个短整型和一个整型。再定义一个结构体B,它嵌套结构体A,并且还有一个双精度浮点型成员。请分析结构体B的内存布局,并计算结构体B的大小。同时说明内存对齐的规则是如何应用的。
10.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 结构体A的定义及分析
    • 结构体A定义如下:
struct A {
    char arr[3];
    short num1;
    int num2;
};
  • 内存布局分析:
    • char arr[3]占用3个字节。
    • short num1通常占用2个字节。由于内存对齐规则,short类型变量存储地址需要是2的倍数,而char arr[3]占用3个字节,所以在arr之后会填充1个字节,使得num1的起始地址是2的倍数。
    • int num2通常占用4个字节。它的起始地址需要是4的倍数,此时前面arrnum1以及填充字节共占用6个字节,所以在num1之后会填充2个字节,使得num2的起始地址是4的倍数。
  • 结构体A的大小:3 + 1 + 2 + 2 + 4 = 12字节。
  1. 结构体B的定义及分析
    • 结构体B定义如下:
struct B {
    struct A a;
    double num3;
};
  • 内存布局分析:
    • 结构体B包含结构体A,结构体A大小为12字节。
    • double num3通常占用8个字节。double类型变量存储地址需要是8的倍数,而结构体A占用12字节,所以在结构体A之后会填充4个字节,使得num3的起始地址是8的倍数。
  • 结构体B的大小:12 + 4 + 8 = 24字节。
  1. 内存对齐规则
    • 规则1:结构体成员的起始地址必须是该成员大小的整数倍:例如short类型成员起始地址要是2的倍数,int类型成员起始地址要是4的倍数,double类型成员起始地址要是8的倍数等。
    • 规则2:结构体的总大小必须是其最大成员大小的整数倍:在结构体A中,最大成员是int类型,大小为4,所以结构体A总大小是12(4的整数倍)。在结构体B中,最大成员是double类型,大小为8,所以结构体B总大小是24(8的整数倍)。