首页 > 解决方案 > C++ 内存地址分配

问题描述

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

考虑以下 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 个字节?

标签: c++memory

解决方案


现在您给了我们代码,我们可以回答您的问题。

所以令人困惑的是:&arr + i. 这并不像你认为的那样。请记住,&优先于+. 因此,您获取地址arr并将其向前移动i

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

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

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


推荐阅读