我一直在使用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
的打印输出中,前半部分元素都是乱码。知道发生了什么事吗?
答案 0 :(得分:2)
您没有使用二维数组。您正在使用1维数组和另一个存储指针集的数组。表示不能保证您的阵列将连续驻留在内存中。
每次在代码中询问新的分配时,程序都会找到适合(新)数组的(新)内存区域。如果要打印存储指针的数组,则可以读取数组实际所在的位置。
答案 1 :(得分:1)
正如其他人所说,你不应该在这里使用memcpy。
但是对于记录来说,当用这种方式做一个memcpy时,你在mat2中删除指针,造成泄漏,并且你在mat2中复制的东西太大了,这会让你记忆力下降。 正确的memcpy方式是独立地记忆mat2中mat1的每个条目。