2013-05-13 90 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一起運行。

這些工具確實有些重疊,但有一些錯誤,只有兩種工具中的一種會被捕獲。