【问题标题】:mempcy fail to copy all datamemcpy 无法复制所有数据
【发布时间】:2010-07-01 05:21:45
【问题描述】:

我在 C 中遇到 memcpy 问题。这是代码:

typedef struct {
CPY_IM009_DEF
}message;

message msg;

CPY_IM009_DEF 是其他文件中的结构。那我试试这个

char wx_msg_buf[8192];
memset(wx_msg_buf, 32, sizeof (wx_msg_buf));
memcpy(wx_msg_buf, &msg, sizeof (msg));

当我检查尺寸时:

sizeof (msg) = 2140

sizeof (wx_msg_buf) = 8192

但是当我检查 wx_msg_buf 时,memcpy 只会将部分 msg 复制到 wx_msg_buf(从 2140 到 200)。 我想知道为什么会这样?如果需要更多代码,请告诉我

感谢您的帮助。

【问题讨论】:

  • 我想我们需要看看CPY_IM009_DEF的定义
  • 您没有显示 msg 正在初始化,因此可以想象它从未设置过,memcpy 正在做它应该做的事情,除了你正在喂它垃圾源数据。当您更改缓冲区的大小时(在对您的问题的评论中作为答案),它可能已经改变了内存的布局,使得未初始化的数据区域看起来更符合您的期望看到 - - 可能字节未设置为 0。
  • 其实msg已经初始化了,但是因为代码太大就不放这里了。

标签: c memcpy


【解决方案1】:

你是如何检查的?只是打印字符串或在调试器中查看它?如果消息中包含任何 '\0' 字符。它将在第一个停止打印。

要查看整个内容,您可以循环并打印每个字符。像这样的:

int i;
for(i = 0; i < sizeof(wx_msg_buf); ++i) {
   printf("%02x ", wx_msg_buf[i]);
}

【讨论】:

  • sizeof(msg) 因为那是 memcpy() 中使用的内容。
  • @Heath:当然,我想他不妨看看整个缓冲区:-P。
  • 我使用 GDB 检查它,放置一个断点然后打印 msg 和 wx_msg_buf
  • Evan 所说的可能是把 wx_msg_buf 和一个 C 字符串处理。在 gdb (print wx_msg_buf) 中打印它只会带您到第一个空值。您需要转储缓冲区的全部内容才能确定。
【解决方案2】:

代码对我来说看起来不错。问题可能出在你看待它的方式上。底层结构的布局是什么,你用什么工具来观察这 2000 个字节?

【讨论】:

  • 当我在 GDB 中打印值时,它会显示如下结果: (gdb) p wx_msg_buf $1 = "0000L_NAME00000POSLH000FN_NAME", '0' , "4800010120100101010100COM_HDR0B.MX_BUFFER", '0 '
【解决方案3】:

在调试器中检查您的源数据和结果数据。

memcpy() 有一个缺陷几乎是不可想象的,它被广泛使用。

【讨论】:

  • 我知道这就是我感到困惑的原因。我在代码中多次使用 memcpy(),但只有这一行有问题
【解决方案4】:

尝试一次; “memmove”而不是“memcpy”.. memcpy() 更快,但在源和目标重叠的地方移动内存块是不安全的。在这些情况下,可以使用 memmove() 来移动内存。

所以最好使用“memmove”..我认为它会解决你的问题

【讨论】:

  • msg 和 wx_msg_buf 是不同的变量。它们不重叠,因此您不会通过 memmove 获得任何额外的安全性。
【解决方案5】:

好的,我换了:

char wx_msg_buf[8192];

进入

char wx_msg_buf[2141];

现在代码工作了,我还是不明白为什么以前的代码不能工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多