二维数组中的动态内存分配

时间:2012-12-18 03:57:46

标签: c++

我必须创建动态的2d数组。我正在尝试使用下面提到的代码:

假设a=512 and b =102。所以现在创建的二维数组是ary[512][102]。 现在我正在创建指向基本位置的指针,即int *ptr=&(ary[0][0]);

现在,如果我给指针偏移102,即ptr+=102,它应该指向&(ary [1] [0]),但它并没有指向。 如果给定的偏移量为104,那么只有它指向&(ary[1][0])。为什么需要额外2个Offset ????

代码段:

int** ary;
ary= new int*[a];
for(int i = 0; i < a; ++i)
ary[i] = new int[b];

3 个答案:

答案 0 :(得分:0)

你的2d数组是动态分配的,因为你的代码建议,所以这个2d数组的地址不是顺序的,因此&(ary[0][0])+102,你不能让返回的指针是下一行。因此,在这种情况下,您应该使用&(ary[1][0])

答案 1 :(得分:0)

在这种情况下,您的二维数组在实际内存中不一定是线性的。所以你不能写一个程序,假设内存是线性的。
104指向ary [1] [0]的原因可能是边界对齐。运行时系统选择使用104字节作为ary [i],而不是102.

答案 2 :(得分:0)

与2D数组的静态分配不同,当您使用多个new时,整个数组的地址不是连续的。相反,当您调用new()创建2D数组的行时,每个new都会返回从堆分配的完全不相关的地址。因此,您必须使用ary[n]访问(n + 1)th行和ary[n+1]的元素才能访问(n+2)th行的元素,依此类推。