Memcpy:错误的字节数

Memcpy: wrong number of bytes

我有一个可变大小的矩阵,我需要在每次迭代时对其进行备份。为此,我使用了一个相同大小(以字节为单位)的指针和 memcpy 函数。

void DoSmth(int ** mainMat, ...){ 
   int * backUp = malloc(columns * lines * sizeof(int));
   ...
   memcpy(backUp, mainMat, columns * lines * sizeof(int)); // back-up
   ...
   memcpy(mainMat, backUp, columns * lines * sizeof(int)); // restore
   ...
}

程序编译运行没有错误,但我发现我备份和恢复的数据不完整,更确切地说只有矩阵的前n行是正确的,最后几行不正确` t 恢复。如果我增加 memcpy 的第三个参数(例如,而不是 400 - 10 * 10 * sizeof(int) - 我尝试使用 600),矩阵的所有行都会被恢复。

我的问题是为什么会发生这种情况,我该如何解决。

memcpy(backUp, mainMat, columns * lines * sizeof(int));

您调用 memcpy 就好像 mainMat 指向或指向一个数组数组。但这是不可能的,因为 mainMat 是指向指针的指针。相反,它可能指向指向数组的指针数组。由于数组不是指针,因此这两种类型不兼容。

事实上,您的 memcpy 根本不需要复制 int 对象:它是将某些 int* 指针的字节复制到分配的内存中或从中复制出来。

如果您需要将所有 int 对象复制出和复制到与 mainMat 关联的存储中,您将需要遍历 mainMat 的元素并复制出并进入它包含的每个指针。这将一次复制一行或一列(取决于您的矩阵方向约定)。