是否有可能將內存從指針重新分配給C中的NULL?從0的內存的c realloc 0
int *v = 0;
for(i = 0; i < 10; i++)
v = (int *) realloc(v, (i+1)*sizeof(int));
是否有可能將內存從指針重新分配給C中的NULL?從0的內存的c realloc 0
int *v = 0;
for(i = 0; i < 10; i++)
v = (int *) realloc(v, (i+1)*sizeof(int));
如果ptr爲NULL,則對於所有大小的值,調用等價於malloc(size)。
來源:人3 realloc
「在那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失敗時,您將失去對分配內存的引用。
好提示,在使用realloc()時保持對分配內存的引用() – Philip 2011-03-29 10:56:17
heh - 似乎我們都在同一時間回答: – pentaphobe 2011-03-29 06:10:50
的realloc man page:
realloc()的改變存儲器塊的大小由ptr指向size字節。內容將保持原有尺寸和最小尺寸的最小值;新分配的內存將被初始化。如果ptr爲NULL,則調用等價於malloc(size);如果size等於零,則該調用等價於free(ptr)。除非ptr爲NULL,否則它必須早先通過調用malloc(),calloc()或realloc()返回。如果指向的區域被移動,則完成一個空閒(ptr)。
從manpage:
若ptr爲NULL,則調用等效 對malloc(大小);如果大小等於 零,則該呼叫等於 免費(ptr)。除非ptr爲NULL,否則必須先由 向malloc(),calloc()或realloc()返回 。
但是,你不應該忘記,realloc()
可以返回NULL如果不能調整的內存。如果發生這種情況,您發佈的代碼可能會導致分配多塊內存,因爲NULL返回值將被反饋回realloc()
,然後該代碼將分配一個新塊。 (希望你是不是真的使用這些代碼無論如何...)
從標準
7.20.3.4/3 ...如果ptr爲空指針,則realloc函數的行爲就像malloc的函數爲指定的大小。
是的,但是這個代碼會泄漏內存並在'realloc'失敗時丟失數據。 – 2011-03-29 12:15:11