realloc函式的用法

2021-07-03 02:59:42 字數 2012 閱讀 7743

realloc(void *__ptr, size_t __size):更改已經配置的記憶體空間,即更改由malloc()函式分配的記憶體空間的大小。

如果將分配的記憶體減少,realloc僅僅是改變索引的資訊。

如果是將分配的記憶體擴大,則有以下情況:

1)如果當前記憶體段後面有需要的記憶體空間,則直接擴充套件這段記憶體空間,realloc()將返回原指標。

2)如果當前記憶體段後面的空閒位元組不夠,那麼就使用堆中的第乙個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,並將原來的資料塊釋放掉,返回新的記憶體塊位置。

3)如果申請失敗,將返回null,此時,原來的指標仍然有效。

注意:如果呼叫成功,不管當前記憶體段後面的空閒空間是否滿足要求,都會釋放掉原來的指標,重新返回乙個指標,雖然返回的指標有可能和原來的指標一樣,即不能再次釋放掉原來的指標。

看一下示例**

[cpp]view plain

copy

#include 

#include 

intmain(

intargc, 

char

* argv, 

char

* envp)  

printf("numbers2 addr: %8x\n"

,(int

)numbers2);  

for(n=0;n<5;n++) 

//初始化

printf("enter new size: "

);  

scanf("%d"

,&input);  

//重新分配記憶體空間,如果分配成功的話,就釋放numbers2指標,

//但是並沒有將numbers2指標賦為null,也就是說釋放掉的是系統分配的堆空間,

//和該指標沒有直接的關係,現在仍然可以用numbers2來訪問這部分堆空間,但是

//現在的堆空間已經不屬於該程序的了。

numbers1=(int

*)realloc(numbers2,(input+5)*

sizeof

(int

));  

if(numbers1==null)  

printf("numbers1 addr: %8x\n"

,(int

)numbers1);  

/*for(n=0;n<5;n++) //輸出從numbers2拷貝來的資料

*/for

(n=0;n//新資料初始化

printf("\n"

);  

free(numbers1);//釋放numbers1,此處不需要釋放numbers1,因為在realloc()時已經釋放

numbers1=null;  

//free(numbers2);//不能再次釋放

return

0;  

}  

如果當前記憶體段後有足夠的空間,realloc()返回原來的指標:

[plain]view plain

copy

yugsuo@ubuntu:~/linux/memange$ gcc -g -o realloc realloc_example.c   

yugsuo@ubuntu:~/linux/memange$ ./realloc   

numbers2 addr:  8afc008  

enter new size: 10  

numbers1 addr:  8afc008  

如果當前記憶體段後沒有足夠的空間,realloc()返回乙個新的記憶體段的指標:

[plain]view plain

copy

yugsuo@ubuntu:~/linux/memange$ ./realloc   

numbers2 addr:  9505008  

enter new size: 1000000  

numbers1 addr: b716f008  

realloc函 realloc函式用法

realloc 用過很多次了。無非就是將已經存在的一塊記憶體擴大。char p malloc 1024 char q realloc p,2048 現在的問題是我們應該如何處理指標 p。剛開始按照我最直觀的理解,如果就是直接將 p null 到最後只需要釋放 q的空間就可以了。因為最近在做個封裝。結...

realloc函 realloc函式使用規則

realloc函式使用規則如下 1 realloc失敗的時候,返回null 2 realloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動 3 假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體 原來的記憶體 剩餘記憶體,realloc還是返回原來記憶體的位址 假如原來的記憶...

有趣的 realloc 函式

在 c 語言中,我們最熟悉的函式排行榜上,malloc 和 free 想必名列前茅,而 realloc 則可能就要靠後了。不過你知道嗎,有了 realloc 函式,你甚至可以不使用 malloc 或者 free,而是由它一力承擔。該函式的原型如下 void realloc void ptr,size...