设有如下定义语句:
union u_type{
int i;
double x;
float f;
};
struct str_type{
char str[100];
union u_type u[2];
则语句“printf(“%d”, sizeof(struct str_type) );”的输出结果是( )
A、100 B、116 C、120 D、200
struct str_type { char str[100]; // 占用100字节 union u_type u[2]; // 每个共用体应占用8字节(由最大成员double决定),共2个则为16字节 };
到目前为止,理论上的大小是100(字符数组)+ 16(两个共用体)= 116字节。
在str[100]和u[2]之间或者在整个struct str_type的末尾有额外的填充字节来确保结构体的对齐。这种额外的填充是为了满足特定平台上的内存对齐要求,这通常是为了提高访问内存的效率。
str[100]
u[2]
struct str_type
由于double可能要求按照8字节对齐,编译器可能在char str[100]后面添加了4个字节的填充,以确保union u_type u[2]能在8字节对齐的地址开始。这样,整个结构体的大小变为:
double
char str[100]
union u_type u[2]
@admin
120
答案是120,上机试了,120是8的整数倍
这题应该选C,116不是8的倍数
整体大小不是要是double8的整数倍吗 我算的120但是不知道错哪了选116
这题是c还是b?
康斯坦丁 回复 123 21: 120
C
在考虑内存对齐的情况下,...
用户登录可进行刷题及查看答案
在考虑内存对齐的情况下,我们需要对结构体的内存布局进行分析。
首先,对于union u_type,其大小由其最大的成员决定,也就是double x,所以它的大小是8字节。
接下来,对于struct str_type:
char str[100]:大小为100字节。 union u_type u[2]:大小为2 * 8 = 16字节。 在大多数平台上,struct的对齐通常是基于其最宽成员的对齐要求。在这里,最宽的成员是double x,所以结构体的对齐要求可能是8字节。
那么,在进行内存布局时,char str[100]占据100字节,之后可能有一些填充字节使得union u_type u[2]能够按照8字节对齐开始。考虑到100字节后正好是12的倍数,为了满足8字节对齐,可能会插入4个填充字节。之后,union u_type u[2]占据16字节。
所以,整个struct str_type的大小可能是100字节(char数组) + 4字节(填充) + 16字节(两个union)= 120字节。
因此,考虑内存对齐后,"printf("%d", sizeof(struct str_type));"的输出结果可能是120。答案是C、120。
登录后提交答案