2013-05-13 94 views
1

我试图从deque复制一个错误对象的内容,但是当我检查复制的内容时,它是不正确的。正确使用memcpy in C

typedef struct ER_OBJECT 
{ 
    uint8 error_type; 

    union 
    { 
     uint32 number; 
     char *message; 
    } error; 

} ER_OBJECT; 

void er_copy(DE_LIST *deque, ER_OBJECT *object) 
{ 
    ER_OBJECT *marker; 

    marker = er_get_first_object(deque); 

    memcpy(object, marker, sizeof(*marker)); 
} 

一切直至并包括功能er_get_first_object作品 预期,即我可以检查标记的内容,它是正确的。这使我相信问题在于memcpy。

如果我创建了一个名为marker2的ER_OBJECT的第二个指针,并使用memcpy到 将marker的内容复制到marker2中,那么一切正常。只有当我 试图将标记的内容复制到发生错误 的外部对象时。

有人会这么好,指出我做错了什么?

+2

你的代码看起来没问题。也许你在其他地方搞乱了你的堆。考虑使用[valgrind](http://valgrind.org/) – 2013-05-13 23:34:28

+1

确实,它看起来更像是'object'的内存缓冲区没有被正确分配或类似的东西。 – 2013-05-13 23:36:37

+0

你如何检查标记,对象和marker2的内容?在调试器中?也许你可以发布内存转储。你看er_copy()'返回前后的对象内容吗? – 2013-05-13 23:38:49

回答

1

不幸的是,发布的代码是正确的。

我说“不幸”,因为这意味着问题在您的程序中的其他地方。我建议使用其他工具,例如Mudflap和Valgrind。

  1. 如果使用GCC,请使用-fmudflap进行编译。这需要安装mudflap库。
  2. 与Valgrind一起运行。

这些工具确实有些重叠,但有一些错误,只有两种工具中的一种会被捕获。