2011-03-29 51 views
-1

是否有可能將內存從指針重新分配給C中的NULL?從0的內存的c realloc 0

int *v = 0; 
for(i = 0; i < 10; i++) 
    v = (int *) realloc(v, (i+1)*sizeof(int)); 
+0

是的,但是這個代碼會泄漏內存並在'realloc'失敗時丟失數據。 – 2011-03-29 12:15:11

回答

2

如果ptr爲NULL,則對於所有大小的值,調用等價於malloc(size)。

來源:人3 realloc

2

「在那PTR是NULL的情況下,功能恰好表現爲malloc的,分配的大小字節的新塊和返回指針到它的開始。」

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

順便說一句,我知道這個代碼是隻針對這個問題,但你應該總是更新您的指針之前檢查的realloc的返回值:

int *p,*tmp; 

tmp = (int *)realloc(p, nBytes); 
if(tmp){ 
    p = tmp; 
} 
else{ 
    //Out of memory! 
} 

如果不這樣做,當realloc失敗時,您將失去對分配內存的引用。

+0

好提示,在使用realloc()時保持對分配內存的引用() – Philip 2011-03-29 10:56:17

0

是的。

here

如果ptr爲空指針,realloc()的 行爲就像malloc()函數用於 指定的大小。

+0

heh - 似乎我們都在同一時間回答: – pentaphobe 2011-03-29 06:10:50

0

的realloc man page

realloc()的改變存儲器塊的大小由ptr指向size字節。內容將保持原有尺寸和最小尺寸的最小值;新分配的內存將被初始化。如果ptr爲NULL,則調用等價於malloc(size);如果size等於零,則該調用等價於free(ptr)。除非ptr爲NULL,否則它必須早先通過調用malloc(),calloc()或realloc()返回。如果指向的區域被移動,則完成一個空閒(ptr)。

1

manpage

若ptr爲NULL,則調用等效 對malloc(大小);如果大小等於 零,則該呼叫等於 免費(ptr)。除非ptr爲NULL,否則必須先由 向malloc(),calloc()或realloc()返回 。

但是,你不應該忘記,realloc()可以返回NULL如果不能調整的內存。如果發生這種情況,您發佈的代碼可能會導致分配多塊內存,因爲NULL返回值將被反饋回realloc(),然後該代碼將分配一個新塊。 (希望你是不是真的使用這些代碼無論如何...)

2

從標準

7.20.3.4/3 ...如果ptr爲空指針,則realloc函數的行爲就像malloc的函數爲指定的大小。