我們知道,當我們宣告乙個陣列的時候,必須要用乙個常量指定陣列的長度,這是由於它所需要的記憶體空間取決於資料。但是如果我們不能**程式所需要的精確陣列長度,為了保證足夠的空間,常常宣告乙個很大的長度,由此便可能造成不必要的空間浪費。所以引入了動態記憶體分配的概念。
在動態記憶體分配中,c函式庫給我們提供了四個函式,分別是malloc(),realloc(),calloc()以及free()。
一.malloc()函式的用法及注意事項
例:#include
#inlcude
int main()
int i=0;
int* p=(int* )malloc(10*sizeof(int));
/*這裡給指標p開闢了4個整形空間的大小,即40個位元組。注意此處必須有強制型別轉換,還有sizeof所求長度的物件型別*/
if(p=null)
printf("out of memory");
exit(-1);
/*此處相當於exit(exit_failure);*/
for(i=0;i<10;i++)
p[i]=i;
return 0;
注意:單次malloc開闢出的空間是連續的,內容並未初始化,是乙個隨機值。多次開闢出來的不一定連續,所以要考慮記憶體碎片的問題。
二.calloc()
calloc()的主要功能和malloc()一樣用於分配記憶體,但是與後者不同的是在返回的時候將記憶體全部初始化為0,這將節省初始化的時間,calloc的引數包括所需元素的數量和每個元素的位元組數。
例:#include
int main( )
int i=0;
int* p=(int*)calloc(sizeof(int)*10);
for(i=0;i<10;i++)
p[i]=i;
return 0;
三.realloc()
這個函式主要用於修改已將分配的記憶體大小,在realloc(p,size)中,p指向前面已經分配好的記憶體,size指調整後的大小,而且p指向的內容必須是用malloc開闢出來的。如果在函式中呼叫了malloc函式,而且在函式呼叫之後不用free釋放掉該空間,則該空間不會被釋放,知道整個程式結束。
※在堆上開闢的空間,都必須用free()才能釋放,例如malloc(),由此可說明free()內部有某種機制識別空間能否被free掉。
四,常見的動態記憶體錯誤
1.釋放一部分開闢後的內容
#include
int main( )
int* p=(int*)malloc(sizeof(int)*10);
free(p+5);/*釋放5個整型空間的大小*/
return 0;
※.free之後,p的指標並不為空,依然指向原來的位址,因此在釋放之後,一定要將p賦成null,而且在使用指標之前一定要判斷其是否為空,但是free掉乙個空指標是可以的。
本文出自 「福大馨」 部落格,請務必保留此出處
動態記憶體分配小結
動態記憶體分配中的free 是釋放的意思 釋放是修改了申請的記憶體的使用狀態,從可用變成不可用,裡面的資料還在,但是使用權已經交還給系統 int p malloc sizeof int 10 free p free p 當我們對同一塊記憶體進行多次釋放的時候,會造成系統的崩潰,這種情況是過度釋放造成...
1 動態記憶體分配
1.1 c語言的資料結構,通常都是固定大小的,比如 陣列有固定的大小,而每個元素也有固定的長度。這樣對程式有一定限制,例如 我們要使用陣列來儲存乙個班級的學生資訊,陣列的長度指定多大合適呢?太大浪費空間,太小不夠用。這時候就會用到記憶體的動態分配。1.2 記憶體分配函式 malloc函式,分配記憶體...
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...