为什么分配的二维 int 数组与普通数组具有不同的内存地址序列?

Why does an allocated 2-dimensional int array have a different sequence of memory addresses as a normal one?

以下代码输出动态分配数组的内存地址序列,然后通过嵌套 for 循环输出常规二维数组(整数)。

#include <iostream>
using namespace std;

int main()
{
    int regArray[3][3]; //a normal 2d array
    int **allocatedArray = new int*[3];

    for (int i = 0; i < 3; i++)
        allocatedArray[i] = new int[3]; //an allocated 2d array


    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            cout << &allocatedArray[i][j] << "    " << &regArray[i][j] << endl; 
            //prints the allocated array, leaves a space, then a regular one
}

输出结果如下:

0x7812e8    0x29febc
0x7812ec    0x29fec0
0x7812f0    0x29fec4
0x781300    0x29fec8
0x781304    0x29fecc
0x781308    0x29fed0
0x781318    0x29fed4
0x78131c    0x29fed8
0x781320    0x29fedc

Process returned 0 (0x0)   execution time : 0.249 s
Press any key to continue.

我知道在常规数组(右侧)中,下一个元素的地址导致增加 4 个字节(十六进制形式)。但是,在分配的数组(左侧)中,情况似乎并非如此。在执行内部 for 循环期间,正常增加 4 个字节,符合预期。每当外层循环迭代的时候,好像都增加了10。

一个例子是:0x7812f0 跳转到 0x781300。

为什么会出现这种情况?任何简单的解释表示赞赏。

您的两个数组都已分配。但他们使用不同形式的分配(分别为自动动态)。

您的第一个数组将 9 个整数放在 9 个连续的内存位置。

您的第二个数组分配三个独立的块,每个块包含 3 个连续的内存位置。这 3 个块可以在任何地方,它们不必在内存中彼此相邻。

你的输出证实了这一点。

下面的代码表示分配一个指向指针数组的指针

int **allocatedArray = new int*[3];

这里是让每个指针成为一个分配的数组

allocatedArray[i] = new int[3];

上面的代码分配了一个int数组,应该是12个字节,但是一维数组的每2个之间没有关系。

所以,allocatedArray[i][j]的大小是4个字节 allocatedArray[i] 是 12 个字节

你说的10个字节纯属巧合