C++:如何将 memcpy 与指针 ** 一起使用?

问题描述 投票:0回答:3

我使用这个代码:

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

定义:

double** arr;           // arr1 is defined 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*”相同;预期的“双精度”或显式长度 [-Wsizeof-pointer-memaccess]

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

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

c++ pointers c++11
3个回答
9
投票

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

这个警告很完美,谢谢。


8
投票

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

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
投票

尝试使用

sizeof(double) * col
sizeof()
不知道您传递给
new
的参数是什么。

© www.soinside.com 2019 - 2024. All rights reserved.