首页 > 试题广场 >

在32系统下输出的结果为

[单选题]
在32系统下输出的结果为(      )
#include <stdio.h>

#pragma pack(2)
struct Test1
{
int a;
char b;
short c;
int *d;
}A;
#pragma pack()

#pragma pack(4)
struct Test2
{
int *d;
char b;
int a;
short c;
}B;
#pragma pack()

int main()
{
printf("%d,%d\n",sizeof(A),sizeof(B));
return 0;
}


  • 12,16
  • 13,13
  • 16,16
  • 其他几项都不对
#pragma pack(2)/*指定按2字节对齐*/ struct Test1 { int a; char b; short c; int *d; }A; #pragma pack()/*指定按2字节对齐*/ 第一个变量a的自身对齐值为4,指定对齐值为2,所以,其有效对齐值为2,假设Test1从0x0000开始,那么a存放在0x0000、0x0001、0x0002、0x0003四个连续字节中,符合0x0000%2= 0; 第二个变量b,自身对齐值为1,指定对齐值为2,所以有效对齐值为1,所以存放在0x0004字节中,符合0x0004%1=0; 第三个变量c的自身对齐值为2,指定对齐值为2 ,所以有效对齐值为2,顺序存放 在0x0006、0x0007中,符合0x000(5+1)%2=0; 第四个变量d,(包含指针类型的情况。只要记住指针本身所占的存储空间是4个字节就行了,而不必看它是指向什么类型的指针),自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0008、0x0009,0x000A、0x000B中,符合0x0008%2=0。 所以从0x0000到0x0000B共12字节存放的是Test1的变量。又Test1的自身对齐值为4,所以Test1的有效对齐值为2。又12%2=0,Test1只占用0x0000到0x000B的12个字节。所以sizeof(A)=12. #pragma pack(4) struct Test2 { int *d; char b; int a; short c; }B; #pragma pack() 第一个变量d的自身对齐值为4(包含指针类型的情况。只要记住指针本身所占的存储空间是4个字节就行了,而不必看它是指向什么类型的指针),指定对齐值为4,所以,其有效对齐值为4,假设Test2从0x0000开始,那么d存放在0x0000、0x0001、0x0002、0x0003四个连续字节中,符合0x0000%4= 0; 第二个变量b,自身对齐值为1,指定对齐值为4,所以有效对齐值为1,所以存放在0x0004字节中,符合0x0004%1=0; 第三个变量a的自身对齐值为4,指定对齐值为4,所以有效对齐值为4,顺序存放 在0x0008、0x0009,0x000A、0x000B中,符合0x000(5+3)%4=0; 第四个变量c,自身对齐值为2,指定对齐值为4,所以有效对齐值为2,所以顺序存放在0x000C、0x000D中,符合0x000C%2=0。 所以从0x0000到0x0000D共13字节存放的是Test2的变量。 又Test2的自身对齐值为4,所以Test2的有效对齐值为4。又(13+3)%4=0, 所以sizeof(B)=16.
编辑于 2019-08-29 12:16:38 回复(0)