说我有一个结构:
struct guitar{
long guitarID;
short brand:3;
short strings: 6;
short price;
}x[5][5]; //Thanks chux
如果x的地址是0xaaa并且存储器以4的倍数对齐那么地址在x [1]处是什么?
我想知道的另一件事是品牌和字符串之间的数字范围现在是否受到位域的影响?
答案 0 :(得分:1)
让我们尝试计算它。首先你需要知道结构的大小。由于大小取决于实现,因此我们考虑使用32位计算机。
你的结构的第一个成员guitarID有4个字节。然后,你有3位品牌,6位字符串。这两个,以及填充,组成另外2个字节。然后,你还有2个字节的价格。总的来说,你的结构占用8个字节。
现在,让我们看看你的数组是如何存储的。你有一个5乘5的矩阵。在内存中,它是线性存储的,如下所示:
x [0] [0] x [0] [1] x [0] [2] x [0] [3] x [0] [4] x [1] [0] x [1] [ 1] x [1] [2] x [1] [3]
等等。我不确切地知道你的意思x [1],但我认为你对x [1] [0]的地址感兴趣。你可以看到它前面有5个元素,这意味着它的地址比第一个元素的地址高5 * 8 = 40个字节。我不能给你一个绝对的地址作为答案,因为你提到的第一个元素的地址0xaaa不是字对齐的。
答案 1 :(得分:1)
假设长8个字节,短2个字节,内存为4个字节,对齐大小为8字节+ 3位+ 6位+ 2字节= 8 + 4 = 12个字节。
x [1]只不过是& x [1] [0]。
如果x为0xaaa,则x [1]为0xaaa +(5 * 12)= 0xaaa + 60。
因此x [1]与x相距60个字节。