我使用这个代码:
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]));
我不明白那是什么。你能告诉我如何让它正常工作吗?
sizeof(arr1[i])
产生 double*
指针变量的大小,而不是您分配的数组的实际大小。
这个警告很完美,谢谢。
一个小的可视化可以帮助您更好地理解警告。
假设 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);
希望这有帮助!
尝试使用
sizeof(double) * col
。 sizeof()
不知道您传递给 new
的参数是什么。