C的動態記憶體

2021-08-21 16:00:48 字數 2179 閱讀 9517

在陣列問題中,常常會遇到需要建立長度為變數的陣列,通常的陣列定義就不能滿足這一要求了,這時就有動態記憶體的出場了。動態記憶體是乙個動態建立大記憶體的概念,它存在於stdlib.h這一頭檔案裡,其中有malloc、calloc、realloc、free這四個函式來表示動態記憶體。

malloc是分配記憶體塊的函式。通常在windows中,堆中最大的連續記憶體大概1.3g左右,這也是函式可分配得到的最大連續記憶體。void *malloc(size_t  size),在這個定義中,可以看出,這個函式只有分配的位元組這乙個引數。同時還有乙個重要的返回值,當可分配的記憶體不足時,該函式返回了無效的指標傳遞給分配空間或null。

int *p = (int *)malloc(10*sizeof(int));這一句對指標的記憶體分配就相當於int p[n];(n為變數)

圖1 上圖表示將400位元組的記憶體分配給p,同時對p進行初始化置零。 這一函式可以跟簡便地使用calloc這一函式實現。

calloc是分配記憶體中的乙個陣列的元素初始化為0的函式。void  *calloc(size_t  num,size_t  size),在這個定義中,可以看出,這個函式有元素的數目和位元組長度兩個引數。

圖2 圖2這一語句就等同於圖1。

realloc是重新分配記憶體塊的乙個函式。對於重新分配記憶體,我們可以使用malloc這一函式進行實現:

圖3 可以看出,重新分配記憶體使用for迴圈和malloc函式不是很簡便,realloc這一函式就能很好的解決這一情況。 

void  *realloc(void  *memblock,size_t  size);這一定義中,有兩個引數分別是對以前指定的指標記憶體塊、新的位元組大小。

圖4 合理使用這一函式可以對**進行更好的精進。看到這裡,你就會發現在這有了free這一函式了。

free是釋放記憶體塊的函式,它用來釋放有calloc、malloc、或realloc呼叫的此前分配的記憶體塊,所以在使用了呼叫記憶體的函式之後,一定要進行記憶體釋放,否則記憶體洩漏就會造成影響。void free(void  *memblock);在這個函式中只有乙個定義,需要釋放的此前分配過的記憶體。而在使用它的時候也一定要謹慎小心,不然它會造成你程式崩潰,以下就是free函式造成崩潰的四個原因。

再回去看malloc的定義,你就會發現定義中的引數是分配的位元組,而不是上圖中乙個整型數字20,程式就會強行認為20就是位元組,這就造成了陣列越界,導致程式崩潰。

對於這一原因我們可以抽象地用圖來進行演示。

我們在進行對指標p初始化時,p指在了對其分配的記憶體塊開始處,也就是第乙個格仔的頭,程式進入for迴圈中,p指向發生了變化,p++使它指向了第二個格仔,迴圈繼續,以此類推,p繼續後移,這時再進行記憶體釋放,系統找不到需要釋放的記憶體塊的頭,然後造成崩潰。

這個**中第二句已經將p進行賦值給了q,對p、q重複釋放也是造成程式崩潰的原因之一

這個很簡單,對a賦值為10,a分配得到的記憶體不是動態記憶體,當然也會崩潰。

到此,動態記憶體就介紹完了,學會動態記憶體對今後的c語言學習有很大幫助,對此我們也應該去好好地掌握住它。

C 動態記憶體

了解動態記憶體在 c 中是如何工作的是成為一名合格的 c 程式設計師必不可少的。c 程式中的記憶體分為兩個部分 很多時候,您無法提前預知需要多少記憶體來儲存某個定義變數中的特定資訊,所需記憶體的大小需要在執行時才能確定。在 c 中,您可以使用特殊的運算子為給定型別的變數在執行時分配堆內的記憶體,這會...

C 動態記憶體

棧 在函式內部宣告的所有變數都將占用棧記憶體 堆 這是程式中未使用的記憶體,在程式執行時可用於動態分配記憶體 new和delet運算子 動態分配記憶體的通用語法 new data type 如果自由儲存區已被用完,可能無法成功分配記憶體。所以建議檢查 new 運算子是否返回 null 指標,並採取以...

C 動態記憶體

到目前為止,我們的程式中我們只用了宣告變數 陣列和其他物件 objects 所必需的記憶體空間,這些記憶體空間的大小都在程式執行之前就已經確定了。但如果我們需要記憶體大小為乙個變數,其數值只有在程式執行時 runtime 才能確定,例如有些情況下我們需要根據使用者輸入來決定必需的記憶體空間,那麼我們...