realloc 用方法 void realloc(void , n) 根據n的大小,如果n比較小,就沿用原來的記憶體地址(也就是返回的地址就是原來的地址),在原來地址的記憶體空間的最後面,加上n大小的記憶體空間;如果n比較大,系統就不會沿用原來的記憶體地址,系統有新開闢一個記憶體空間,並把原來記憶體空間里存放的 ...
realloc 用方法
void* realloc(void*, n)
- 根據n的大小,如果n比較小,就沿用原來的記憶體地址(也就是返回的地址就是原來的地址),在原來地址的記憶體空間的最後面,加上n大小的記憶體空間;如果n比較大,系統就不會沿用原來的記憶體地址,系統有新開闢一個記憶體空間,並把原來記憶體空間里存放的值複製過來,這時realloc的返回地址和原來的地址就不同了。
- 當realloc返回的地址不是原來的地址的時候,realloc函數會釋放掉原來地址的記憶體空間,在這種情況下,如果在realloc調用的後面,free(原來的地址),就會發生吐核(segment fault),所以,最後只需要free(新的地址)就可以了。
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p = (int*)malloc(sizeof(int) * 5);
if(NULL == p){
}
for(int i = 0; i < 5; ++i){
*(p + i) = i;
}
for(int i = 0; i < 5; ++i){
printf("%d ",*(p + i));
}
printf("\n");
//由於新要求的空間過大,realloc就會釋放掉原來的p指向的空間,然後再從新開闢空間,並把地址返回給p1,這時p和p1就不指向同一個地址了。
int *p1 = (int*)realloc(p,sizeof(int) * 800000);
for(int k = 5; k < 8; ++k){
*(p1 + k) = k;
}
for(int i = 0; i < 8; ++i){
printf("%d ",*(p1 + i));
}
printf("\n");
//free(p); //因為要求新的空間過大,所以就不沿用原來的地址,再釋放原來的地址就吐核了;如果要求新的空間不大的話,free(p)和free(p1)哪個都可以,但只能調用其中的一個。
free(p1);//釋放新地址的記憶體空間
}