【问题标题】:C++ Memory Address AllocationC++ 内存地址分配
【发布时间】:2019-07-01 21:43:04
【问题描述】:

抱歉,我很沮丧,并在没有适当细节的情况下通过手机发布了问题

考虑以下 C++ 代码:

 int arr[2];
    arr[0] = 10;
    arr[1] = 20;
   // cout << &arr;
    for (int i = 0; i < 2; i++)
    {
       cout << &arr + i << "\t\t"<<endl;
    }

    cout << sizeof (arr);

cout in for 循环打印如下

0x7ffeefbff580 0x7ffeefbff588

比第一个元素多8个字节

我的问题是,如果在我的机器上 sizeof(int) 为 4,为什么它是 8 个字节而不是 4 个字节?

【问题讨论】:

  • 您使用的是哪个编译器、工具集、操作系统?
  • @FaisalKhan 不太可能sizeof(arr) 返回2。向我们展示代码。
  • @FaisalKhan 这个&amp;arr 返回一个指向int[2] 的指针,它是一个大小为8 的结构。 它不返回指向 int 的指针。所以&amp;arr + 1 向前移动了 8 个字节。 &amp;arr[1] 不是 8 个字节。因为你应该做的是&amp;arr[0] 而不是&amp;arr 因为&amp;arr[0] 是一个指向int的指针&amp;arr 不是。它们指向同一个地方,但大小不同,因此指针算法的工作方式不同。
  • @FaisalKhan 当您执行&amp;arr + i 时,您得到的是(&amp;arr) + i,而您真正想要的是(arr + i)(在这种情况下不需要与号)。

标签: c++ memory


【解决方案1】:

既然您给了我们代码,我们就可以回答您的问题了。

所以令人困惑的是:&amp;arr + i。这并不像你认为的那样。请记住,&amp; 优先于 +。所以你把arr的地址向前移动i次。

指针运算的工作方式是&amp;x + 1 将指针向前移动size(x)。那么在您的情况下,size(arr) 是什么?它是 8,因为它是 2 元素整数数组(我假设整数的大小为 4)。所以&amp;arr + 1 实际上将指针向前移动了 8 个字节。你所经历的确切的事情。您不要求下一个 int,而是要求下一个 array。我鼓励您尝试一下,例如将 arr 定义为 int[3](大小为 12)并查看指针如何向前移动 12 个字节。

所以第一个解决方案是在没有&amp; 的情况下执行arr + i。我们可以将指针算法应用于数组,在这种情况下,它会衰减为指针类型int*。现在因为 int 的大小为 4,所以 arr + 1 正确指向向前 4 个字节的内存段。

但我的建议是远离指针运算,而改为使用&amp;arr[i]。这做同样的事情,但 IMO 更不容易出错,更少混淆,并告诉我们更多关于意图。

【讨论】:

  • 非常感谢您的宝贵时间。这真的很有帮助。您能否指导我获取有关内存分配的详细说明的更多资源?
  • @FaisalKhan 我们讨论的只是指针算法和引用。我们根本没有触及内存分配。 C++ 内存模型(以及其他一切)是一个复杂的野兽。我想你可以从这里开始:stackoverflow.com/questions/388242/…
猜你喜欢
  • 2020-07-06
  • 2020-08-15
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
相关资源
最近更新 更多