C語言 ---- realloc\malloc\calloc

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 }
相關文章
相關標籤/搜索