C ++:如何在指针**中使用memcpy?

时间:2016-05-07 05:09:32

标签: c++ pointers c++11

我使用此代码:

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构建它并得到结果:

警告:'void * memcpy(void *,const void *,size_t)'调用中'sizeof'的参数与目标的指针类型'double *'相同;预期的'double'或显式长度[-Wsizeof-pointer-memaccess]

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

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

3 个答案:

答案 0 :(得分:8)

`value of x=10; value of k=-3; value of a=-11;` 产生sizeof(arr1[i])指针变量的大小,而不是您已分配的数组的实际大小。

警告是完美的,欣赏它。

答案 1 :(得分:6)

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

enter image description here

假设row = 2且col = 2.上图显示了arr1[0]的可视化。

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

如果col = 2,则arr1[0]可以包含两个双精度值,即arr1[0][0]arr1[0][1],如图所示。由于您要复制整行,您必须指定由arr1[0]保留的字节长度,可由sizeof(double)*col按@ToddChristensen或sizeof(arr1[i][0])*col指示。

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

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

希望这有帮助!

答案 2 :(得分:2)

请尝试使用<Limit GET HEAD POST> order deny,allow deny from 81.52.168.0/23 deny from 188.138.10.163/32 deny from 188.138.78.129/32 allow from all </Limit> sizeof(double) * col并不知道您传递给sizeof()的论据。