realloc函_realloc(重新分配内存空间的函数)
在頭文件中定義void * realloc(void * ptr,size_t new_size);
重新分配給定的內存區域。它必須預先分配malloc(),calloc()或realloc()尚未釋放與free或呼叫realloc。否則,結果是不確定的。
重新分配由以下兩者之一完成:
a)ptr如有可能,擴大或縮小指定的現有地區。該地區的內容保持不變,直至新舊尺寸中的較小者。如果區域展開,則數組新部分的內容未定義。
b)分配一個大小為new_size字節的新內存塊,復制大小等于新舊大小較小者的內存區域,并釋放舊塊。
如果沒有足夠的內存,則舊的內存塊不會被釋放,并返回空指針。
如果ptr是NULL,則行為與調用malloc(new_size)相同。
如果new_size為零,則行為是實現定義的(可能會返回空指針(在這種情況下,可能會釋放或不釋放舊的內存塊),或者可能會返回一些可能不用于訪問存儲的非空指針)。
realloc是線程安全的:它的行為就像訪問通過其參數可見的內存位置,而不是任何靜態存儲。先前調用free或realloc來釋放內存區域的同步 - 調用任何分配函數,包括分配相同或部分同一區域內存的realloc。在通過釋放函數訪問內存之后以及在通過重新分配訪問內存之前,會發生此同步。所有分配和解除分配功能在內存的每個特定區域都有一個總的順序。(自C11以來)
參數
PTR-指向要重新分配的內存區域的指針new_size-數組的新大小
返回值
成功時,將指針返回到新分配的內存的開始位置。返回的指針必須用free()或來解除分配realloc()。原始指針ptr無效,并且對它的任何訪問都是未定義的行為(即使重新分配就地)。
失敗時,返回一個空指針。原始指針ptr仍然有效,可能需要使用free()or 取消分配realloc()。
注釋
從C11 DR 400開始不支持零大小。
最初(在C89中),增加了對零大小的支持以適應如下代碼。
OBJ?*p?=?calloc(0,?sizeof(OBJ));?//?"zero-length"?placeholder...while(1)?{
p?=?realloc(p,?c?*?sizeof(OBJ));?//?reallocations?until?size?settles????...?//?code?that?may?change?c?or?break?out?of?loop}
例
#include?#include?
int?main(void){
int?*pa?=?malloc(10?*?sizeof?*pa);?//?allocate?an?array?of?10?int????if(pa)?{????????printf("%zu?bytes?allocated.?Storing?ints:?",?10*sizeof(int));????????for(int?n?=?0;?n?
int?*pb?=?realloc(pa,?1000000?*?sizeof?*pb);?//?reallocate?array?to?a?larger?size????if(pb)?{????????printf("\n%zu?bytes?allocated,?first?10?ints?are:?",?1000000*sizeof(int));????????for(int?n?=?0;?n?
輸出:
40?bytes?allocated.?Storing?ints:?0?1?2?3?4?5?6?7?8?94000000?bytes?allocated,?first?10?ints?are:?0?1?2?3?4?5?6?7?8?9
參考
C11標準(ISO / IEC 9899:2011):7.22.3.5 realloc函數(p:349)
C99標準(ISO / IEC 9899:1999):7.20.3.4 realloc函數(p:314)
C89 / C90標準(ISO / IEC 9899:1990):4.10.3.4 realloc函數
總結
以上是生活随笔為你收集整理的realloc函_realloc(重新分配内存空间的函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios 隐藏app的插件_等了5年终于复
- 下一篇: 计算机控制系统笔记,笔记型计算机的电源控