首页 > 试题广场 >

假设 sizeof(char)=1,sizeof(short

[填空题]
typedef struct
{
char flag[3];
short value;
} sampleStruct;
union
{
char flag[3];
short value;
} sampleUnion;

假设 sizeof(char)=1,sizeof(short)=2, 那么sizeof(sampleStruct) =1, sizeof(sampleUnion) =2

推荐

输出结果是:6,4

字符类型占1字节, 可以从任何地址开始

short类型占2字节, 必须从2字节倍数地址开始

int类型占4字节,必须从4字节倍数地址开始

0000  a[0]

0001  a[1]

0002  a[2]

0003  空一个字节

0004 b 这个是2倍数的地址

0005

结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。


编辑于 2015-01-27 10:37:14 回复(6)
结构体 
字符型占用1字节,不需要字节对齐 
short占用2字节,需要两字节对齐 
所以sizeof(sampleStruct) = 3 *(1字节) + (1个补齐字节) + 1*(2字节) = 6 
联合体
占用大小采用成员最大长度的对齐,最大长度是short的2字节
char flag[3]需要3个字节
所以 sizeof(sampleUnion) = 2*(2字节) = 4
编辑于 2015-07-20 10:49:00 回复(1)
对Union结构体,sizeof的取值不仅考虑sizeof最大的成员,还要考虑对齐字节,对齐字节的取值是取成员类型字节最大值与指定对齐字节(32位机器默认是4,64位机器默认是8)两者中的较小值,本题中成员类型最大值为short,2,与指定对齐字节4比较取2,所以要2字节对齐,如果去掉short变量,则取char的1字节对齐,结果为3
编辑于 2015-10-10 15:07:11 回复(0)
关于补齐 以及第一个为什么不按4字节补齐
请参阅 http://blog.csdn.net/fly542/article/details/7217882
发表于 2015-09-07 16:02:02 回复(0)
数据对齐原则:
1.结构体每个成员相对结构体首地址的偏移量都是成员大小的倍数;
2.结构体总大小为结构体最宽成员大小倍数。
sampleStruct: 1+1+1(char)+1(原则 1,补空)+2=6
sampleUnion:成员最大字节数为short:2,数组为1+1+1,原则2,故总字节数为2*2=4
发表于 2016-02-25 19:17:53 回复(0)
结构体在内存组织上是顺序式的
字符类型占1字节, 可以从任何地址开始

short类型占2字节, 必须从2字节倍数地址开始

int类型占4字节,必须从4字节倍数地址开始

0000  a[0]

0001  a[1]

0002  a[2]

0003  空一个字节

0004 b 这个是2倍数的地址

0005

联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。

占用大小采用成员最大长度的对齐,最大长度是short的2字节
 char flag[3]需要3个字节
所以 sizeof(sampleUnion) = 2*(2字节) = 4
发表于 2016-11-06 16:10:50 回复(0)
默认4字节对齐
sampleStruct 是4+2 ,
sampleUnion 取最大的成员的字节数,然后4字节对齐。
发表于 2015-01-13 17:19:43 回复(1)
结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值
发表于 2017-09-06 14:07:37 回复(0)
感觉看了一些解析还是不太明白,这里我来解释一下
联合体sizeof的原则:
  1. 装下最大的那个
  2. 同时是所有类型的基本长度的最小公倍数才行
比如这题,首先是char数组大小3,但是short的大小是2,所以最终补齐必须是能够整除2才行
发表于 2017-07-07 09:57:52 回复(0)
阿西吧,如果结构体内类型的最大字节小于系统位数对应的字节,那么按类型的最大字节对齐!!
发表于 2017-06-25 13:00:16 回复(0)
来自@LittleNumb
结构体 
字符型占用1字节,不需要字节对齐 
short占用2字节,需要两字节对齐 
所以sizeof(sampleStruct) = 3 *(1字节) + (1个补齐字节) + 1*(2字节) = 6 
联合体
占用大小采用成员最大长度的对齐,最大长度是short的2字节
 char flag[3]需要3个字节
所以 sizeof(sampleUnion) = 2*(2字节) = 4
发表于 2017-05-05 21:45:38 回复(0)
不管什么体,都得先对其,一看最大元素的倍数,二看系统最小对其,注意长的变量不一定比小变量数组的总和大
发表于 2016-11-16 19:14:58 回复(0)
整体对齐时,取结构体中最大的变量类型值2,再与int类型值4比较,取小的那个2,6是2的整数倍,所以符合
发表于 2016-10-03 19:25:56 回复(0)
union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。
一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,也就是flag[3],3个字节。然后最大对齐,第二个答案为4。

发表于 2016-08-24 22:39:15 回复(0)
关键在于
最大长度成员的选择看的是基本类型
数组不算

发表于 2016-06-26 17:58:46 回复(0)
由题知道是32位,结构体本身需要在4字节对齐处,此处不知道环境,就当编译器默认4字节对齐吧,结构体成员相对于结构体收地址的偏移量应该是成员自身对齐参数与编译器默认参数中的较小者,于是char 的对齐参数是1 short的对齐参数是2 ,然后整个结构体需要占的空间是结构体各成员自身对齐参数最大者即2与编译器默认参数4比较取较小者2,即整个结构体占2n,再保证最小内存占用,故大小为6
发表于 2016-06-22 13:37:02 回复(0)
联合体采用最大成员长度对齐的方式。
编辑于 2016-05-18 22:23:43 回复(0)
是最大占字节数据类型的倍数,不是一定要按8、16这些对齐!
发表于 2016-02-25 01:41:32 回复(0)
union
{
	char flag[3];  // 肯定2的倍数,占4个字节
	short value;
} sampleUnion;

发表于 2016-01-13 21:44:57 回复(0)

我觉得  是  把  char数组当字符串来看  末尾 \0  占一位      是不是更直观   可以这样理解吗?

对别的不知道适用不?

编辑于 2015-09-28 13:30:44 回复(2)
答案:5,3
结构体中
char flag[3];
short value;
总的站3+2=5字节
联合体中,看最大的数据类型占用的字节数就是联合体的字节数
char flag[3];这里占用3字节
发表于 2015-01-26 20:35:29 回复(2)