内存位置和范围
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 个字节。
假设我有一个结构:
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 个字节。