什麼是內存的動態分配
全局變量分配在內存中的靜態存儲區,非靜態的局部變量(包括形參)分配在內存中的動態存儲區,這個存儲區是一個稱爲棧(stack)的區域。除此以外,C語言還允許建立內存動態分配區域以存放一些臨時用的數據,這些數據不必在程序的聲明部分定義,也不必等到函數結束時才釋放,而是需要時隨時開闢,不需要時隨時釋放。這些數據是臨時存放在一個特別的自由存儲區,稱爲堆(heap)區。可以根據需要,向系統申請所需大小的空間。由於未在聲明部分定義它們爲變量或數組,因此不能通過變量名或者數組名去引用這些數據,只能通過指針來引用。
怎樣建立內存的動態分配
對內存的動態分配是通過系統提供的庫函數來實現的,主要有malloc,calloc,free,realloc這四個函數
malloc函數
函數原型爲
void *malloc(unsigned int size);
其作用是在內存的動態存儲區中分配一個長度爲size的連續空間。形參size的類型定爲無符號整型(不允許爲負數)。此函數的值是所分配區域的第一個字節的地址。
注意指針的基類型爲void,即不指向任何類型的數據,只提供一個地址。如果此函數未能成功執行,則返回空指針(NULL)。
calloc函數
函數原型爲
void *calloc(unsigned n, unsigned size);
其作用是在內存的動態存儲區中分配n個長度爲size的連續空間,這個空間一般比較大,足以保存一個數組。
用calloc函數可以爲一維數組開闢動態存儲空間,n爲數組元素個數,每個元素長度爲size。這就是動態數組。函數返回指向所分配區域的起始位置指針;如果分配不成功,返回NULL。
free函數
函數原型爲
void free(void *p);
其作用是釋放指針變量p所指向的動態空間,使這部分空間能重新被其他變量使用。p是最近一次調用calloc或malloc函數時得到的函數返回值。
relloc函數
函數原型爲
void *relloc(void *p, unsigned int size);
如果已經通過calloc或者malloc函數獲得了動態空間,想改變其大小,可以用relloc函數重新分配。
用relloc函數將p所指向的動態空間的大小改變爲size。p的值不變。如果重新分配不成功,則返回NULL。