Memcpy:错误的字节数

时间:2017-11-06 01:28:58

标签: c memcpy

我有一个可变大小的矩阵,我需要在每次迭代时进行备份。为此,我使用相同大小(以字节为单位)的指针和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行是正确的,最后一行没有恢复。如果我增加memcpy的第三个参数(例如,而不是400 - 10 * 10 * sizeof(int) - 我尝试使用600),则恢复矩阵的所有行。

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

1 个答案:

答案 0 :(得分:2)

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

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

事实上,你的memcpy根本不必复制int个对象:它正在将一些int*指针的字节复制到已分配的内存中。

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