【问题标题】:Memcpy: wrong number of bytesMemcpy:错误的字节数
【发布时间】:2017-11-06 01:28:57
【问题描述】:

我有一个可变大小的矩阵,我需要在每次迭代时对其进行备份。为此,我使用了相同大小(以字节为单位)的指针和 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),则矩阵的所有行都将恢复。

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

【问题讨论】:

  • 您能否提供一些代码来重现该问题?
  • memcpy(backUp, *mainMat, columns * lines * sizeof(int));, memcpy(*mainMat, backup, columns * lines * sizeof(int));
  • @MayankJain 我无法提供更多代码,抱歉。但所有信息都在伪代码中。
  • @BLUEPIXY 您的解决方案只是减少了未恢复的行数,矩阵的最后一行仍然错误。
  • 我猜是因为没有其他部分的信息。如果这些更正有误,则需要更多信息。

标签: c memcpy


【解决方案1】:
memcpy(backUp, mainMat, columns * lines * sizeof(int));

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

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

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

【讨论】:

  • 谢谢你和@yano。我逐行复制,它可以工作。
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多