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

mja*_*mja 0 c++ pointers c++11

我用这个代码:

memcpy(arr[i], arr1[i], sizeof(arr1[i]));
Run Code Online (Sandbox Code Playgroud)

定义:

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]));
}
Run Code Online (Sandbox Code Playgroud)

我用命令构建它: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]));
                             ^
Run Code Online (Sandbox Code Playgroud)

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

πάν*_*ῥεῖ 8

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

这个警告是完美的,欣赏它.


MNS*_*MNS 6

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

在此输入图像描述

假设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);
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!