参加考试,我遇到了一个有趣的问题。
我有一个结构:
struct vehicle {
long carId;
short wheels:3;
short fuelTank : 6;
short weight;
} x[5][5];
并且x的地址是0xaaa,内存以4的倍数对齐,x [1]的地址是什么?
我不知道从哪里开始但是我发现结构的大小为16,而当x [5] [5]为400时结构的大小显然是16的倍数。 其中一个就是答案:
a) 0xD2 b) 0xEA c)0xDC d) 0xAB
但我不知道如何从0xaaa到其中一个。
答案 0 :(得分:1)
由于在问题中写道“......内存以4的倍数对齐”,因此假设long类型占用4个字节。
两个相邻的位域
short wheels:3;
short fuelTank : 6;
可以容纳short int
类型的一个对象。因此它们占用两个字节(尽管通常情况下是实现定义),与下一个数据成员
short weight;
因此我们得到结构的大小等于8个字节。
x[1]
是数组的第二个元素,类型为struct vechicle[5]
因此,当结构的大小等于8时,则数组元素的大小等于8 * 5 = 40
。在十六进制表示法中,它等于0x28
因此,x[1]
数组的第二个元素的地址是
0xaaa
+
0x28
=====
0xad2