c語言中realloc 函式解析

2021-07-15 11:47:11 字數 2012 閱讀 1131

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  

C語言realloc函式解析

在網上查了很多資料,終於大概知道了這個函式的原理 void realloc void ptr,size t size 作用 更改已經配置的堆記憶體空間,說白了在c語言中就是更改由malloc 函式分配的記憶體空間的大小。當需要將已分配的記憶體減小時,則返回原指標,僅僅是對應索引的記憶體空間減小了 當...

C語言函式realloc

原型 extern void realloc void mem address,unsigned int newsize 語法 指標名 資料型別 realloc 要改變記憶體大小的指標名,新的大小 標頭檔案 include 有些編譯器需要 include 在tc2.0中可以使用alloc.h標頭檔案...

C語言中realloc 使用詳解

realloc函式用來為ptr重新分配大小為size的一塊記憶體,看似很簡單,在使用過程中卻會發生各種錯誤。函式形式為 void realloc void ptr,size t new size 最近在網上檢視了一些資料,在glibc中沒有找到具體的實現 有人找到了可以發給我,ladd.cn gma...