[英]Confusion about using malloc/calloc pointer to hold the return value of realloc
[英]Confusion about realloc function
我使用此參考讀了C中的動態內存分配。
那個文件Say's:
realloc()只應用於動態分配的內存。 如果未動態分配內存,則行為未定義。
如果我們使用這樣的realloc()
:
int main()
{
int *ptr;
int *ptr_new = (int *)realloc(ptr, sizeof(int));
return 0;
}
根據該引用,該程序未定義,因為指針ptr未動態分配。
但是,如果我使用類似的東西:
int main()
{
int *ptr = NULL;
int *ptr_new = (int *)realloc(ptr, sizeof(int));
return 0;
}
根據該參考,它是否也是未定義的行為?
我的第二種情況不會調用未定義的行為。 我對嗎?
第一種情況有未定義的行為,第二種情況沒有。 在第一種情況下, ptr
的值是不確定的。 因此,將該值傳遞給realloc
或任何函數,本身是不確定的。
另一方面,由於realloc
在傳遞空指針值時具有良好定義的行為(它就像調用malloc
) 1 ,第二段代碼完全合法(除了你沒有free
任何東西的事實)。
1 7.22.3.5 realloc函數/ p3
如果ptr是空指針,則realloc函數的行為類似於指定大小的malloc函數。
在第一種情況下,程序幾乎肯定將通過segmentation fault
完成,因為在堆中創建的鏈接列表以查找段不一致,在第二種情況下,您使用NULL第一個參數調用realloc,這意味着,是一個調用相當於malloc(size)
man realloc
說:
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);
如果ptr為NULL,則對於所有size值,調用等效於malloc(size)
唯一的授權參考是標准文檔。 n1570 (最新的C11標准)有如下說法:
§7.22.3.5的realloc
功能,P3:
如果
ptr
是空指針,則realloc
函數的行為類似於指定大小的malloc
函數。 否則,如果ptr
與先前由內存管理函數返回的指針不匹配,或者如果通過調用free
或realloc
函數釋放了空間,則行為未定義。 [...]
所以,你的第二個例子是明確定義的。
realloc函數釋放ptr指向的舊對象,並返回指向具有size指定大小的新對象的指針。
所以第一種情況是未定義的行為。
realloc()
將根據7.20.3.4.3 realloc函數充當malloc()
如果ptr是空指針,則realloc函數的行為類似於指定大小的malloc函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.