動態記憶體分配課後小結(1)

2021-07-12 05:30:17 字數 1465 閱讀 5586

我們知道,當我們宣告乙個陣列的時候,必須要用乙個常量指定陣列的長度,這是由於它所需要的記憶體空間取決於資料。但是如果我們不能**程式所需要的精確陣列長度,為了保證足夠的空間,常常宣告乙個很大的長度,由此便可能造成不必要的空間浪費。所以引入了動態記憶體分配的概念。

在動態記憶體分配中,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來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...