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...