首页 > 试题广场 >

在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
  • 其他几项都不对

结构体大小计算

结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。

结构体内偏移规则

1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。

2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。


结构体A共有一个int类型,一个char类型,一个short类型成员,一个int *类型成员。如果只按照这几个成员大小相加,结构体大小应该是 4+1+2+4=11个字节大小。但实际上该结构体A是12个字节大小。

下面来一步步分析编译器是如何计算大小进行分配的。(以下未标明单位的数字以字节为单位)

1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条。

2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。

3、成员变量c,偏移量为5,大小为2,不符合偏移规则第一条。在成员b和c之间填充一个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下。

4、成员变量d,偏移量为8,大小为4,符合偏移规则第一条

6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是a,int;d,int *类型,4个字节,当前结构体计算出的大小为12,满足第二条偏移规则。到此结构体A大小计算结束。

结构体B共有一个int *类型成员,一个char类型一个int类型,一个short类型成员。如果只按照这几个成员大小相加,结构体大小应该是 4+1+4+2=11个字节大小。但实际上该结构体B是16个字节大小。

下面来一步步分析编译器是如何计算大小进行分配的。(以下未标明单位的数字以字节为单位)

1、遇到第一个成员变量d,该成员偏移量为0,大小为4,符合偏移规则第一条。

2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。

3、成员变量a,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c之间填充三个字节,此时,偏移量大小为12,符合偏移规则第一条,继续往下。

4、成员变量c,偏移量为12,大小为2,符合偏移规则第一条。

6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是a,int;d,int *类型,4个字节,当前结构体计算出的大小为14,并不符合第二条规则,于是在末尾填充2个字节,总大小为16个字节,满足第二条偏移规则。




发表于 2019-08-30 14:15:33 回复(1)
结构体大小涉及到字节对齐
发表于 2019-09-04 20:03:01 回复(0)
为啥是a啊,有人能解答一下吗
发表于 2019-08-28 17:35:42 回复(1)