为什么分配的二维int数组具有与正常情况不同的内存地址序列?

时间:2015-12-27 05:42:46

标签: c++ arrays pointers dynamic-memory-allocation

以下代码通过嵌套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] << "    " << &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。

为什么会这样?任何简单的解释都表示赞赏。

2 个答案:

答案 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个字节只是一个巧合