为什么分配的二维 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] << " " << ®Array[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个字节纯属巧合
以下代码输出动态分配数组的内存地址序列,然后通过嵌套 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] << " " << ®Array[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个字节纯属巧合