首页 > 试题广场 >

在一台普通的32位机器上,struct {char a; f

[单选题]
在32位机器上,下面结构体
struct {
    char a; 
    float b; 
    short c; 
    char d
};
sizeof的结果为()
  • 16
  • 8
  • 12
  • 10
32位机器默认4位对齐,起始地址必须位4的整数倍,首先是char类型的,占一个字节,需放在1字节的整数倍位置,任何整数都是1的倍数,所以直接存放,然后是float类型,占4个字节,需放在4的整数倍位置,前面char只占一个字节,所以需要补三个字节的空位保证float放在4的整数倍位置,接下来是short占两字节,放在2的整数倍位置,之前是float占了4个字节,所以short存放的位置是4的整数倍也就是2的整数倍位置,直接存放,最后是char,放在1的整数倍位置,直接放入,但是32位机器4位对齐,最终的内存大小必须是4的整数倍,所以最后char补一字节即(1+3,4,2,1)+1=12
发表于 2021-06-16 15:42:53 回复(1)
1+++ 1111 11 1+
编辑于 2020-08-19 08:45:29 回复(1)
可以想象32位系统是按行划分在内存之中。c语言结构体是按内存对齐的方式存放在内存中的,内存对齐通俗来讲就是每行32bit中,如果有一行存不满,则剩余位置不存数,另起一行开始存数。因为计算机是按行存取的,如果变跨行存储可能会导致后续操作不方便。

编辑于 2022-03-10 18:11:05 回复(1)
主要涉及内存对齐
char--1,float--4,short--2
1+4=5,5%1=0,所以不用对齐
5+2=7,7%2=1,所以以2为最小公倍数对齐8
8+1=9,9%1=0,所以不用对齐。
全部算完再以4为最小公倍数对齐,所以为12。
好像是这么算的吧
发表于 2019-08-17 18:17:56 回复(2)
不应该是16吗?
1+++ 1111 11++ 1+++
发表于 2020-09-02 16:23:55 回复(5)
整理了一张图
发表于 2021-12-20 16:44:09 回复(1)
3种类型,3*4=12
发表于 2021-12-14 15:59:37 回复(0)
<p>以float 4字节对齐,float + short + char = 3*4=12</p>
发表于 2021-02-22 19:39:21 回复(0)
这个题我搞了三天才搞明白 12字节 看下面的图示 a x x x b b b b c c d x 把下面的搞懂就差不多了 struct aa { int a; char c[3]; struct bb { int e[5]; double f[2]; }; int b; }; printf("%d\n",sizeof(struct aa)); 下面是答案 a a a a c c c x e e e e e e e e e e e e e e e e e e e e x x x x f f f f f f f f f f f f f f f f b b b b x x x x
发表于 2022-10-09 14:57:05 回复(1)