MST

星途 面试题库

面试题:C语言中修改结构体对齐方式及应用

1. 已知在C语言中可以通过 `#pragma pack(n)` 指令来指定结构体的对齐方式(`n` 为对齐字节数)。现有结构体定义如下: ```c struct { char a; double b; int c; } data; ``` 请分别计算当 `#pragma pack(1)`、`#pragma pack(4)` 和 `#pragma pack(8)` 时,`sizeof(data)` 的值,并解释结果差异的原因。 2. 请举例说明在什么场景下,手动修改结构体对齐方式是有必要的?
43.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
    • #pragma pack(1)
      • sizeof(data)的值为13。
      • 原因:#pragma pack(1)指定按1字节对齐。char a占1字节,double b占8字节,int c占4字节。由于按1字节对齐,各成员紧密排列,总大小为1 + 8 + 4 = 13字节。
    • #pragma pack(4)
      • sizeof(data)的值为16。
      • 原因:#pragma pack(4)指定按4字节对齐。char a占1字节,为满足4字节对齐,在a后填充3字节,double b占8字节(8是4的倍数,无需填充),int c占4字节。总大小为(1 + 3) + 8 + 4 = 16字节。
    • #pragma pack(8)
      • sizeof(data)的值为24。
      • 原因:#pragma pack(8)指定按8字节对齐。char a占1字节,为满足8字节对齐,在a后填充7字节,double b占8字节(8是8的倍数,无需填充),int c占4字节,为满足8字节对齐,在c后填充4字节。总大小为(1 + 7) + 8 + (4 + 4) = 24字节。
  1. 手动修改结构体对齐方式有必要的场景举例
    • 网络通信:在网络传输数据时,不同系统的默认结构体对齐方式可能不同。为了确保数据在不同系统间准确传输,需要手动设置结构体对齐方式,使其在发送端和接收端保持一致。例如,在客户端和服务器端通信时,统一结构体对齐方式可以避免数据解析错误。
    • 与硬件交互:当与特定硬件设备进行数据交互时,硬件可能对数据的存储格式有特定要求。例如,某些硬件设备可能要求数据按特定字节数对齐才能正确读写。通过手动修改结构体对齐方式,可以使程序与硬件设备更好地兼容。