realloc()函數
extern void *realloc(void *mem_address, unsigned int size);spa
指針名=(數據類型*)realloc(要改變內存大小的指針名,新的大小)。指針
頭文件: <stdlib.h>code
更改已經配置的內存空間,即更改由malloc()函數分配的內存空間的大小。blog
若是將分配的內存減小,realloc僅僅是改變索引的信息。索引
若是是將分配的內存擴大,則有如下狀況:內存
1)若是當前內存段後面有須要的內存空間,則直接擴展這段內存空間,realloc()將返回原指針。get
2)若是當前內存段後面的空閒字節不夠,那麼就使用堆中的第一個可以知足這一要求的內存塊,將目前的數據複製到新的位置,並將原來的數據塊釋放掉,返回新的內存塊位置。原型
3)若是申請失敗,將返回NULL,此時,原來的指針仍然有效。
注意:若是調用成功,無論當前內存段後面的空閒空間是否知足要求,都會釋放掉原來的指針,從新返回一個指針,雖然返回的指針有可能和原來的指針同樣,即不能再次釋放掉原來的指針。當內存再也不使用時,應使用free()函數將內存塊釋放。io
malloc()
extern void *malloc(unsigned int size);
頭文件:stdlib.h。
功能:分配長度爲size字節的內存塊
返回值:若是分配成功則返回指向被分配內存的指針,不然返回空指針NULL。當內存再也不使用時,應使用free()函數將內存塊釋放。
說明:關於該函數的原型,在舊的版本中malloc返回的是char型指針,新的ANSIC標準規定,該函數返回爲void型指針,所以必要時要進行類型轉換。
calloc()
void *calloc(unsigned n,unsigned size);
頭文件:stdlib.h
功 能: 在內存的動態存儲區中分配n個長度爲size的連續空間,函數返回一個指向分配起始地址的指針;若是分配不成功,返回NULL。
跟malloc的區別:calloc在動態分配完內存後,自動初始化該內存空間爲零,而malloc不初始化,裏邊數據是隨機的垃圾數據。
calloc函數一次能夠分配n塊區域。
例如: ps=(struet stu*) calloc(2,sizeof (struct stu));
其中的sizeof(struct stu)是求stu的結構長度。
意思是:按stu的長度分配2塊連續區域,強制轉換爲stu類型,並把其首地址賦予指針變量ps。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) { 5 int n = 10; 6 int i; 7 long *mal = (long *)malloc(n * sizeof(long)); 8 long *cal=(long *)calloc(n,sizeof(long)); 9 10 for (i = 0; i < n; i++) 11 { 12 printf("%d\t", mal[i]); 13 } 14 15 for (i = 0; i < n; i++) 16 { 17 printf("%d\t", cal[i]); 18 } 19 20 printf("malloc內存地址: %p\n", mal); 21 for (i = 0; i < n; i++) mal[i] = i+1; 22 for (i = 0; i < n; i++) printf("%d\t", mal[i]); 23 printf("\n\n"); 24 25 n = 4; 26 mal = (long *)realloc(mal, n*sizeof(long)); 27 printf("realloc內存地址: %p\n", mal); 28 for (i = 0; i < n; i++) printf("%d\t", mal[i]); 29 printf("\n\n"); 30 31 int num = 10; 32 mal= (long *)realloc(mal, num*sizeof(long)); 33 printf("re-realloc內存地址: %p\n", mal); 34 for (i = 0; i < n; i++) printf("%d\t", mal[i]); 35 36 free(mal); 37 free(cal); 38 getchar(); 39 return 0; 40 }