山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省
什么是內存的動態分配
全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區是一個稱為棧(stack)的區域。除此以外,C語言還允許建立內存動態分配區域,以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要時隨時開辟,不需要時隨時釋放。這些數據是臨時存放在一個特別的自由存儲區,稱為堆( heap )區。可以根據需要,向系統申請所需大小的空間。由于未在聲明部分定義它們為變量或數組,因此不能通過變量名或數組名去引用這些數據,只能通過指針來引用。
怎樣建立內存的動態分配
對內存的動態分配是通過系統提供的庫函數來實現的,主要有malloc,calloc,free,realloc這4個函數。
1.用malloc函數開辟動態存儲區
其函數原型為
void * malloc ( unsigned int size ) ;
其作用是在內存的動態存儲區中分配一個長度為size的連續空間。形參size的類型定為無符號整型(不允許為負數)。此函數的值(即“返回值”)是所分配區域的第一個字節的地址,或者說,此函數是一個指針型函數,返回的指針指向該分配域的第一個字節。如:
malloc ( 100 );
/ /開辟100字節的臨時分配域,函數值為其第1個字節的地址
注意指針的基類型為void,即不指向任何類型的數據,只提供一個純地址。如果此函數未能成功地執行(例如內存空間不足),則返回空指針(NULL)。
2.用calloc函數開辟動態存儲區其函數原型為
void *?calloc ( unsigned n , unsigned size ) ;
其作用是在內存的動態存儲區中分配n個長度為size的連續空間,這個空間一般比較大,足以保存一個數組。
用calloc函數可以為一維數組開辟動態存儲空間,n為數組元素個數,每個元素長度為size。這就是動態數組。函數返回指向所分配域的第一個字節的指針;如果分配不成功,返回NULL。
p=calloc(50,4);
/ /開辟50×4個字節的臨時分配域,把首地址賦給指針變量p
3 .用realloc函數重新分配動態存儲區其函數原型為
void * realloc ( void * p , unsigned int size ) ;
如果已經通過malloc函數或calloc函數獲得了動態空間,想改變其大小,可以用recalloc函數重新分配。用realloc函數將p所指向的動態空間的大小改變為size。p的值不變。如果重分配不成功,返回NULL。如:
realloc ( p , 50 );/ /將p所指向的已分配的動態空間改為50字節
4 .用free函數釋放動態存儲區其函數原型為
void free ( void * p );
其作用是釋放指針變量p所指向的動態空間,使這部分空間能重新被其他變量使用。p應是最近一次調用calloc或malloc函數時得到的函數返回值。如:
free(p);
/ /釋放指針變量p所指向的已分配的動態空間
free函數無返回值。
以上4個函數的聲明在stdlib.h頭文件中,在用到這些函數時應當用“# include<stdlib .h >”指令把stdlib.h頭文件包含到程序文件中。