2015-04-17 32 views
-1

学习考试,我遇到了一个有趣的问题。查找具有不同实例的结构的地址

我有一个结构:

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

你是如何得出的结论是,结构的大小是16? – Cristik

+0

@Cristik using(sizeof(x)) –

+0

好的,但是这会给你使用与你的机器相对应的内存对齐方式的struct的大小,它不一定与考试问题的值相同。在计算结构的大小时,需要考虑到这一点。 – Cristik

回答

1

由于在“......内存以4的倍数对齐”的问题中写有这样的说法,假设类型长占用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 
+0

美丽,谢谢你的解释和快速反应! –

+0

@Michel Tamer不客气。:) –