内存位置和范围

Memory locations, and ranges

假设我有一个结构:

struct guitar{
   long guitarID;
   short brand:3;
   short strings: 6;
   short price;
}x[5][5]; //Thanks chux

如果 x 的地址是 0xaaa 并且内存以 4 的倍数对齐,那么 x[1] 的地址是什么?

我想知道的另一件事是品牌和字符串之间的数字范围是多少,因为它们受到位域的影响?

让我们试着计算一下。首先你需要知道结构的大小。由于大小取决于实现,让我们考虑一台 32 位机器。

结构的第一个成员 guitarID 有 4 个字节。然后,您在品牌中有 3 位,在字符串中有 6 位。这 2 个与填充一起构成了另外 2 个字节。然后,您还有另外 2 个字节的价格。您的结构总共占用 8 个字节。

现在,让我们看看您的数组是如何存储的。您有一个 5 x 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 不是字对齐的。

假设长 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 个字节。