簡體   English   中英

關於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在傳遞空指針值時具有良好定義的行為(它就像調用malloc1 ,第二段代碼完全合法(除了你沒有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與先前由內存管理函數返回的指針不匹配,或者如果通過調用freerealloc函數釋放了空間,則行為未定義。 [...]

所以,你的第二個例子是明確定義的。

  1. 第一種情況顯然是未定義的行為,因為我們不知道ptr指向的位置或者ptr當時持有的內容。 並且c標准說7.20.3.4.2 realloc函數

realloc函數釋放ptr指向的舊對象,並返回指向具有size指定大小的新對象的指針。

所以第一種情況是未定義的行為。

  1. 在第二種情況下,編譯器知道ptr具有什么,因此它是有效的,但realloc()將根據7.20.3.4.3 realloc函數充當malloc()

如果ptr是空指針,則realloc函數的行為類似於指定大小的malloc函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM