我必须创建动态的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];
答案 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
行的元素,依此类推。