0

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

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

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

代码片段:

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

3 回答 3

0

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

于 2012-12-18T04:10:02.887 回答
0

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

于 2012-12-18T04:32:06.807 回答
0

与二维数组的静态分配不同,当您使用多个new. 相反,当您要求new()创建 2D 数组的行时,每个新的都会返回完全不相关的地址,这些地址是从堆中分配的。所以你必须使用ary[n]来访问行的元素(n + 1)thary[n+1]访问行的元素(n+2)th等等。

于 2012-12-18T04:33:38.690 回答