首页 > 试题广场 >

【单选】32位系统下,对于下面的结构体A和B,sizeof(

[单选题]
32位系统下,对于下面的结构体A和B,sizeof(A),sizeof(B)的结果分别是()
#include <stdio.h>
#pragma pack(2)
struct A
{
   int a;
   char b;
   short c;
};
#pragma pack()
#pragma pack(4)
struct B
{
   char b;
   int a;
   short c;
};
#pragma pack()
int main()
{
   printf(“sizeof(A)=%d,sizeof(B)=%d\n”,sizeof(A),sizeof(B));
   return 0;
}
  • 8,8
  • 8,10
  • 8,12
  • 7,8
使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
使用伪指令#pragma pack (),取消自定义字节对齐方式
8=4+1+补齐1+2;12=1+补齐3+4+2+补齐2。现学现卖,如有错误,请指出。
发表于 2020-08-07 15:43:37 回复(1)
我的理解是,C语言里 char类型为1字节,short类型为2字节,int类型为4字节。
#pragma pack(2)
struct A
{
   int a;
   char b;
   short c;
};
这里使用伪指令#pragma pack (2),C编译器将按照2个字节对齐。因为int 类型的a为4字节(超了2字节就不管);char类型b为1字节,补齐为2字节;short类型的c为2字节,也不用管。所以结构体A的长度为4+2+2=8字节

对于结构体B,因为使用了#pragma pack (4),C编译器将按照4个字节对齐。
故结构体B的长度为4(char类型的b补齐3字节)+4+4(short类型的c补齐2字节)=12字节。

编辑于 2020-09-10 09:33:04 回复(3)
#pragma pack(2) 为预指令  (2)中数字为代表默认对齐数改为2 一般在vs编译器下默认对齐数设为8 预指令进行更改
如何找每一个成员体的对齐数呢 ?把相应成员体大小与默认对齐数相比 较小值为相应对齐数
第一个 4+1+1(浪费的空间)+2=8 大小为占空间最大成员4的倍数则成立
下面的#pragma pack()意思是取消上面设置的默认对齐数2
第二个同理 1+3(浪费的空间)+4+2=10 由于10不是最大成员体所占空间4的倍数 因此要补到12 故答案为12
发表于 2021-10-09 15:07:28 回复(0)
#pragma pack和自身冲突,选两个中的min值,pack(2)和int,对齐为2字节
发表于 2023-03-06 20:05:22 回复(0)
神奇的是,我用VSCode 算出来是8,8?
发表于 2022-09-03 10:52:18 回复(0)
C
发表于 2021-06-07 19:01:04 回复(0)