我有一个可变大小的矩阵,我需要在每次迭代时进行备份。为此,我使用相同大小(以字节为单位)的指针和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),则恢复矩阵的所有行。
我的问题是为什么会发生这种情况,我该如何解决呢。
答案 0 :(得分:2)
memcpy(backUp, mainMat, columns * lines * sizeof(int));
您正在调用memcpy
,就像mainMat
指向数组数组一样。但这是不可能的,因为mainMat
是指向指针的指针。它可能指向一个指向数组的指针数组。由于数组不是指针,因此这两种类型不兼容。
事实上,你的memcpy
根本不必复制int
个对象:它正在将一些int*
指针的字节复制到已分配的内存中。
如果您需要将所有int
个对象复制到与mainMat
关联的存储空间中,则需要循环遍历mainMat
的元素并复制出来它包含的每个指针。这将一次复制一行或一列(取决于您的矩阵方向约定)。