死于复制由双指针指向二维数组管理的内存

问题描述 投票:1回答:1

代码如下:

#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]的地址不连续吗?

c++ c multidimensional-array memory-management
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]根本不同,并且它们并非微不足道的互操作性。

© www.soinside.com 2019 - 2024. All rights reserved.