2014-03-31 52 views
0

請看下面的代碼處理realloc中的指針?

char *line = (char *) malloc(100); 
char *newline,*source = line; 
int size=100; 
newline = realloc (line , size +=size); 
// assuming that newline has been successfully assigned the demanded memory and line is   freed 

現在我在這裏的問題是,我可以在未來表達寫出這樣

source = newline +(line - source); 

我有一點懷疑,因爲我使用的是line指針是在realloc()成功運行後釋放,但我的程序(這只是它的一個片段)是

仍然在工作嗎?所以可以安全使用line指針a過去realloc()已經完成了嗎?

+0

錯誤:應該是char * newline,* source = line;' – avmohan

+0

'newline +(line + 10)'不會編譯,它試圖將兩個指針加在一起。 – interjay

回答

1

so is it safe to use 'linepointer afterrealloc()` has done?

沒有,因爲realloc的()可以釋放你的輸入緩衝器,同時使新的(如果有新的人比以前的尺寸)。並且realloc會將之前的用戶數據從舊的緩衝區複製到新的緩衝區中。所以用戶應該使用新緩衝區,因爲它包含所有舊信息而不是舊信息。

這是關於realloc()的

void *realloc(void *p, size_t size) realloc changes the size of the object pointed to by p to size. The contents will be unchanged up to the minimum of the old and new sizes. If the new size is larger, the new space is uninitialized. realloc returns a pointer to the new space, or NULL if the request cannot be satisfied, in which case *p is unchanged.

2

不,這不是安全使用行指針的realloc完成後。 realloc更改了line指向的塊的大小。如果大小增加,舊的位置可能沒有足夠的連續空間來容納新的大塊。所以塊在內存中的位置發生了變化。使用realloc返回的指針。
如果舊位置對於用戶請求的較大塊沒有足夠的連續空間,則realloc會嘗試查找所需大小的新塊(如malloc),從舊塊中複製元素並釋放舊塊。
如果realloc失敗,舊的指針是有效的,必須被釋放。如果realloc成功,舊的指針被認爲是無效的,不應該被釋放。
此外,您的程序正在工作的事實並不總是檢查是否正確的好方法。例如,如果您聲明int a[10]並且您訪問a[10]a[11]它可能不會在大部分時間失敗,但它仍然是未定義的行爲。