0

我在 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));

当我检查尺寸时:

大小(味精)= 2140

sizeof (wx_msg_buf) = 8192

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

谢谢你的帮助。

4

5 回答 5

3

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

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

int i;
for(i = 0; i < sizeof(wx_msg_buf); ++i) {
   printf("%02x ", wx_msg_buf[i]);
}
于 2010-07-01T05:33:36.680 回答
1

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

于 2010-07-01T05:34:52.667 回答
0

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

几乎无法想象 memcpy() 有一个缺陷,它被广泛使用。

于 2010-07-01T05:37:35.920 回答
0

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

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

于 2010-07-01T07:29:31.440 回答
0

好的,我改变:

char wx_msg_buf[8192];

进入

char wx_msg_buf[2141];

现在代码工作了,我仍然不明白为什么以前的代码不起作用

于 2010-07-01T10:30:25.213 回答