以下代码通过嵌套for循环输出动态分配的数组的内存地址序列,然后输出常规的2D数组(int)。
#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。
为什么会这样?任何简单的解释都表示赞赏。
答案 0 :(得分:2)
您的两个数组都已分配。但他们使用不同形式的分配(分别是自动和动态)。
您的第一个阵列在9个连续的内存位置放置9个整数。
您的第二个阵列分配三个独立的3个连续内存位置的块。这3个区块可以在任何地方,它们不必在内存中彼此相邻。
您的输出确认了这一点。
答案 1 :(得分:0)
下面的代码意味着分配一个指向指针数组的指针
int **allocatedArray = new int*[3];
这里是使每个指针成为一个已分配的数组
allocatedArray[i] = new int[3];
上面的代码分配一个int数组,该数组应该是12个字节,但是在每个2个1维数组之间没有任何关系。
因此,allocatedArray[i][j]
的大小为4个字节
并且allocatedArray[i]
是12个字节
你提到的10个字节只是一个巧合