1

我有一個簡單的C程序,它有一個指向字符數組的指針。要啓動它,我使用malloc,然後調整大小,然後在程序中稍後設置x次。gdb給出錯誤,但程序運行正常

當我與realloc調整一次,GDB沒有顯示任何錯誤,但是,如果我嘗試再次調用調整大小功能,GDB顯示以下錯誤:

warning: Invalid Address specified to RtlReAllocateHeap(003E0000, 00404076) 

任何想法爲什麼調整它不止一次會產生這個錯誤?

編輯

我發揮它周圍,似乎當我註釋掉指針數據的設置,這是調整大小後的錯誤不會發生。

void setName(struct class_x *class, char *name) 
{ 
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1); 
    class->name = name; 
} 

void *reallocateMemory(void *member, size_t size) 
{ 
    void *tmp = realloc(member, size); 
    if(tmp == NULL) 
    { 
     //handle 
    } 
    return tmp; 
} 
+1

調用realloc的代碼是什麼樣的? – sth 2010-02-06 18:20:33

+0

您是否在realloc後檢查失敗? – 2010-02-06 18:22:12

+1

這是沒有錯誤的,這是一個警告 – tur1ng 2010-02-06 18:24:07

回答

3

class->name = name是不是做你認爲它是。使用strncpy()將輸入字符串複製到新分配的內存中。你在那裏的任務是泄漏你分配的內存並覆蓋指針。然後當您下次撥打電話setName()時,您最終會使用您從malloc()未得到的指針撥打realloc()。我期望在某個地方你用一個常量,全局變量或局部變量字符串調用setName(),這就是最終產生錯誤的原因。如果你只是打電話給setName()的字符串,其內存是從malloc()得到的,你不會看到gdb的警告(但你仍然有錯誤!)。

+0

+1釘釘! – 2010-02-06 18:34:31

+1

考慮到你總是覆蓋存儲在分配緩衝區中的內容,所以根本不需要使用'realloc' - 只需'free'和'malloc'就可以了。 – caf 2010-02-07 00:40:06

0

來看,它的valgrind下或電圍欄 - 這一定會發現內存溢出你

相關問題