2011-10-23 84 views
-2

這是一項家庭作業,所以我不想發佈任何代碼,但我非常難以理解我擁有的錯誤。Realloc C中的無效指針

目前我有一個mableced的數組,並且正在將指針複製到數組。現在,我可以memcpy和memmove這個數組,並且工作正常。

但是,當我做一個realloc與一個無效指針錯誤出現 - 我完全不知道爲什麼。

任何人都可以幫忙嗎?

+2

只有當您顯示'realloc'和朋友的代碼時。 – Jon

+1

你能提供你的代碼嗎? – Xyand

+1

添加一些代碼...我們不能得到什麼問題。 –

回答

1

你說'我將指針複製到另一個變量'。問題是,只要您執行realloc,原始指針不再有效。我沒有看到將指針複製到變量的原因?

+0

這只是爲了幫助我的想法 - 我現在已經拿出來,並直接調用realloc到陣列上 - 它仍然崩潰 – praks5432

+0

所以基本上你做void * ptr = malloc(100); void * next_ptr = realloc(ptr,200);你會得到無效的指針?編號說通過你的代碼在點上打印出一些值,除非你有一個方便的調試器。看看你從malloc返回的值是什麼,然後看看傳遞給realloc的是什麼。我會認爲他們是不同的。看看變量的值在各個點上,直到你縮小什麼線正在改變它 –

+0

好的我正在查看memcpy完成,並在其上完成realloc的數組的內存地址,他們是完全一樣的 – praks5432

2

realloc()只有當指針你傳遞這是一個從malloc()calloc()realloc()(或者是NULL,在這種情況下,它的工作原理完全一樣malloc())早些時候返回工作。你不能在數組上調用它。如果你有一個struct這樣的:

struct foo { 
    char a; 
    int x[5]; 
    double z; 
}; 

那麼你就不能使用realloc()增加x大小。相反,您必須切換到使用完全動態分配:結構成員更改爲指針:

struct foo { 
    char a; 
    int *x; 
    double z; 
}; 

...當你創建struct的實例,調用malloc()的初始分配:

struct foo f; 

f.x = malloc(5 * sizeof f.x[0]); 

現在您可以致電realloc()f.x,但代價是當您不再需要結構時,您還必須在f.x上致電free()

0

reallocfree導致無效指針錯誤或段錯誤,,你一定要傳遞從malloc得到一個有效的指針,然後一個很好的可能性是,你破壞你的記憶:你寫的區域其中malloc用於存儲內存塊的記錄。在你的情況下,這是一個memcpymemmove呼叫。

您可以使用valgrind內存錯誤檢測器來幫助您找到這些類型的錯誤。