memcpy和二维数组

时间:2014-08-13 13:20:37

标签: c++ multidimensional-array memcpy

我一直在使用memcpy一段时间使用一维数组但是当我尝试二维奇怪的事情发生时。以下程序说明了这个问题:

using namespace std;
#include <iostream>  
#include <string.h>
#include <complex>

int main() {

    int n=4;
    complex<double> **mat1=new complex<double>*[n], **mat2=new complex<double>*[n];
    for(int i=0;i<n;i++) {mat1[i]=new complex<double>[n]; mat2[i]=new complex<double>[n];}

    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) mat1[i][j]=complex<double>(i*j, i+j);
    }

    cout << endl << "Matrix 1:" << endl;
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) cout << mat1[i][j] << "  ";
        cout << endl;
    }

    cout << endl << "memcpy" << endl << endl;
    memcpy(mat2, mat1, n*n*sizeof(complex<double>));

    cout << "Matrix 1:" << endl;
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) cout << mat1[i][j] << "  ";
        cout << endl;
    }

    cout << endl << "Matrix 2:" << endl;
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++) cout << mat2[i][j] << "  ";
        cout << endl;
    }
}

mat1的第一个打印输出正常,但在第二个和mat2的打印输出中,前半部分元素都是乱码。知道发生了什么事吗?

2 个答案:

答案 0 :(得分:2)

您没有使用二维数组。您正在使用1维数组和另一个存储指针集的数组。表示不能保证您的阵列将连续驻留在内存中。

每次在代码中询问新的分配时,程序都会找到适合(新)数组的(新)内存区域。如果要打印存储指针的数组,则可以读取数组实际所在的位置。

答案 1 :(得分:1)

正如其他人所说,你不应该在这里使用memcpy。

但是对于记录来说,当用这种方式做一个memcpy时,你在mat2中删除指针,造成泄漏,并且你在mat2中复制的东西太大了,这会让你记忆力下降。 正确的memcpy方式是独立地记忆mat2中mat1的每个条目。