【问题标题】:Memory locations, and ranges内存位置和范围
【发布时间】:2015-10-20 23:58:51
【问题描述】:

假设我有一个结构:

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

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

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

【问题讨论】:

  • ... short price; };x[5][5] 是个问题。 ... short price; } x[5][5]; 更有意义。
  • “内存以 4 的倍数对齐”和“x 是 0xaaa”是矛盾的,因为 0xaaa 不是 4 的倍数。因此不会发生以 4 的倍数对齐或 0xaaa 是小说。
  • 先做一些实验怎么样?

标签: c memory struct bit


【解决方案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 个字节。

【讨论】:

  • 我受到了long为4字节的影响。为什么你认为它是 8?
  • 这会有所不同,例如在 64 位机器 linux ubuntu 14 长是 8 个字节。它不是固定的。
【解决方案2】:

让我们尝试计算它。您需要知道结构的大小的第一件事。由于大小取决于实现,让我们考虑一台 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 不是字对齐的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2011-07-22
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多