代码如下:
#include <iostream>
using std::cout;
int main(int argc, char ** argv)
{
int** p;
int a[2][3]={{-1,-1,-1},
{-1,-1,-1}};
int k=1;
p = new int *[2];
for(int i=0;i<2;i++) {
p[i] = new int[3];
for(int j=0;j<3;j++) {
p[i][j] = k++;
}
}
memcpy(a,p,2 * 3 * sizeof(int));
for(int i=0;i<2;i++){
for(int j=0;j<3;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
delete [] p;
return 0;
}
运行后得到了意外的结果:
26573888 0 26573920
0 0 0
我认为它复制的是地址而不是值,所以我将memcpy(a,p,2 * 3 * sizeof(int));
行更改为
memcpy(a,p[0],2 * 3 * sizeof(int));
和终端打印出来:
1 2 3
0 0 0
如何理解以上结果?谁能帮帮我?
GUESSp[0][2]
和p[1][0]
的地址不连续吗?
您正在混合事物...
This other question(尤其是公认的答案)很好地解释了它。您有一个静态二维数组和一个int**
。
这两个看起来相同,但不同。编译器知道哪个是哪个,所以一个是连续布置的,而另一个不是。
您甚至可以在您的代码中看到它。一旦你写
int a[2][3]={{-1,-1,-1},
{-1,-1,-1}};
它一直在内存中。它基本上与{-1,-1,-1,-1,-1,-1}
相同(从内存角度而言)。还有一次您有循环将int分配到代码中的指针数组中:
p = new int *[2];
for(int i=0;i<2;i++) {
p[i] = new int[3];
for(int j=0;j<3;j++) {
p[i][j] = k++;
}
}
并且[C0行非常清楚,每个p[i] = new int[3]
是一个单独的对象,谁知道谁在哪里。
TL; DR:类型int[3]
与int[2][3]
根本不同,并且它们并非微不足道的互操作性。