2016-05-07 133 views
0

我用这个代码:C++:如何使用memcpy与指针**?

memcpy(arr[i], arr1[i], sizeof(arr1[i])); 

与定义:

double** arr;   // arr1 is difined the same way. 
arr = new double*[row]; 
for (int i = 0; i < row; ++i) { 
    arr[i] = new double[col]; 
    memcpy(arr[i], arr1[i], sizeof(arr1[i])); 
} 

我用命令建立它:g++ -Wall -Wextra -Wpedantic -c arr.cpp并有结果:

警告:在“无效参数 '的sizeof' * memcpy(void *,const void *,size_t)'调用与目标相同的指针类型'double *';预期“双倍”或明确的长度[-Wsizeof-pointer-memaccess]

memcpy(arr[i], arr1[i], sizeof(arr1[i])); 
          ^

我不明白它是什么。你能告诉我如何使它正常工作?

+0

阅读此:http://stackoverflow.com/q/2681061/69537 – Meysam

回答

6

小型可视化可以帮助您更好地理解警告。

enter image description here

假设行= 2和col = 2.以上图为arr1[0]可视化。

在您的代码memcpy(arr[i], arr1[i], sizeof(arr1[i]));中,sizeof(arr1[i])的产量为double *的大小(如@πάνταῥεῖ所示)。如上图所示,arr1[0]是一个双倍指针,因此sizeof(arr1[0])可以取值为4或8,具体取决于您是在运行32位还是64位应用程序。

如果col = 2,那么arr1[0]可以保存两个double值,即arr1[0][0]arr1[0][1],如图所示。由于要复制整行,因此必须指定arr1[0]所保存的字节长度,可通过@ToddChristensen或sizeof(arr1[i][0])*col指示的sizeof(double)*col来实现。

由于您收到的警告要求指定明确的长度,因此您必须使用低于memcpy的值才能使复制操作正常工作。

memcpy(arr[i], arr1[i], sizeof(arr1[i][0])*col); 

希望得到这个帮助!

8

sizeof(arr1[i])产生一个double*指针变量的大小,而不是您分配的数组的实际大小。

该警告是完美的,非常感谢。

2

改为尝试sizeof(double) * colsizeof()不知道您传递给new的参数。