C++,数组中的地址

C++, addresses in array

本文关键字:地址 数组 C++      更新时间:2023-10-16

关于C++中的地址,我有一些有趣的问题。我有这样的代码:

#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    int N = 50 + rand() % 151;
    int arr[N];
    int arr2[N];
    int *ptr1;
    ptr1 = &arr[0];
    for(int i = 0; i < N; i++){
        cout << "Address1: "<< &arr[i]<< "t" << "Address2: " << &arr2[i] << endl;
    }
}

这个代码有效,但地址分配让我担心。这样的输出合法吗?我觉得有点奇怪,第二个数组在内存中的位置比第一个数组早。如果有人知道问题出在哪里,请解释一下哪里出了问题,因为根据定义顺序,第一个必须是第一个数组的地址,而不是第二个的地址。这是在Ubuntu中用g++编译的。

Address1: 0xbf9ab1b8    Address2: 0xbf9ab028
Address1: 0xbf9ab1bc    Address2: 0xbf9ab02c
Address1: 0xbf9ab1c0    Address2: 0xbf9ab030
Address1: 0xbf9ab1c4    Address2: 0xbf9ab034
Address1: 0xbf9ab1c8    Address2: 0xbf9ab038
Address1: 0xbf9ab1cc    Address2: 0xbf9ab03c
Address1: 0xbf9ab1d0    Address2: 0xbf9ab040
Address1: 0xbf9ab1d4    Address2: 0xbf9ab044
Address1: 0xbf9ab1d8    Address2: 0xbf9ab048
Address1: 0xbf9ab1dc    Address2: 0xbf9ab04c
Address1: 0xbf9ab1e0    Address2: 0xbf9ab050
Address1: 0xbf9ab1e4    Address2: 0xbf9ab054
...

我认为第二个数组在内存中的位置比第一个数组早。

事实并非如此。这很正常。

根据防御顺序,第一个必须是第一阵列的地址,而不是第二阵列的地址。

我不知道你从哪里听说块作用域中对象的地址根据定义顺序递增。通常,由于堆栈的工作性质,事实恰恰相反。

不管怎样,这对你来说都不重要;你的电脑可以把物体放在任何它想放的地方。

拿起一本关于计算机体系结构的书了解更多信息。