溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言動態(tài)內(nèi)存如何分配

發(fā)布時間:2022-03-22 16:04:35 來源:億速云 閱讀:115 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“C語言動態(tài)內(nèi)存如何分配”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言動態(tài)內(nèi)存如何分配”文章能幫助大家解決問題。

在我們平時寫程序的時候,需要定義的變量如“unsignedchar a[100];”,這句語句執(zhí)行的時候,編譯器就會給數(shù)組a分配100個字節(jié)的內(nèi)存空間。但是,這個我們之前也簡單提到過,“unsignedchar a[100];”這句數(shù)組定義語句,其實其本身是一種Auto類型的變量類型。而我們前面說過,Auto類型的變量,編譯器會自動將其存儲在“?!笨臻g。這種方式有個非常不方便的地方,一旦當我需要對數(shù)組a存儲超過100長度的數(shù)據(jù),那么整個程序就會出現(xiàn)內(nèi)存溢出。而如果一開始就將這個數(shù)組定義的很大,但是在實際使用中絕大多數(shù)實際數(shù)據(jù)量又不需要那么大,這樣也會產(chǎn)生存儲空間的浪費。
那有沒有一種辦法可以讓一個這個數(shù)組的存儲空間隨心所欲的變化呢?答案顯然是有的,這就是將內(nèi)存申請動態(tài)化,C語言提供了兩個庫函數(shù)malloc和free,分別用于執(zhí)行動態(tài)內(nèi)存的分配和釋放。注意,在C語言中,用malloc申請的內(nèi)存在使用完成后,一定要進行手動釋放,否則會使內(nèi)存消耗殆盡,程序停止運行。malloc和free維護了一個可用的內(nèi)存池,也就是我們之前所謂的“堆”區(qū)。當一個程序需要一塊合適的內(nèi)存時,就使用malloc函數(shù)進行申請,即取出一塊合適的內(nèi)存,并返回一個指向這塊內(nèi)存的指針。需要注意的是,這塊內(nèi)存在被取出來之后,它并沒有被初始化過,因此我們需要手動對其初始化。接著,當程序不想再使用這塊內(nèi)存時,使用free函數(shù)把它歸還給內(nèi)存池。
這兩個函數(shù)都在<std< span="">lib.h>頭文件中聲明,它們的原型為:</std<>
void *malloc(size_t size);void free(void *pointer);
malloc的參數(shù)就是需要分配的內(nèi)存的字節(jié)數(shù),如果內(nèi)存池中的可用內(nèi)存能滿足這個size的大小需求,那么malloc就會返回一個指向被分配的內(nèi)存塊的起始位置的指針。
使用malloc分配的內(nèi)存是一整塊連續(xù)的內(nèi)存。如我們請求它分配100個字節(jié)的內(nèi)存,那么它實際分配的就是100個連續(xù)的字節(jié)。
free函數(shù)調(diào)用時,其形式參數(shù)pointer一定要是一個先前從malloc函數(shù)分配的動態(tài)內(nèi)存的指針,或者是一個NULL參數(shù),如果傳入NULL的話,free函數(shù)將不會產(chǎn)生任何作用。
這里大家注意下,malloc函數(shù)在使用的時候,除了我們需要輸入一個表示申請內(nèi)存大小的參數(shù)外,就不需要輸入其他任何信息了。那么一旦當內(nèi)存申請好之后,編譯器又是如何知道它會被用作整型,浮點型,數(shù)組還是其它的一些數(shù)據(jù)類型的變量呢?這里大家注意一下,malloc函數(shù)的返回值類型,它是一個void *類型的指針,void*指針有一個非常強大的技能,即它可以轉(zhuǎn)換為其它任何類型的指針,不管是C語言的標準數(shù)據(jù)類型,還是我們自己定義的一些結(jié)構(gòu)類型,都是可以完美轉(zhuǎn)換的。
接下來,讓我們寫一段代碼來申請一塊長度為10的int類型的內(nèi)存。如圖1所示。
 C語言動態(tài)內(nèi)存如何分配
圖1 內(nèi)存申請成功
此時,我們已經(jīng)獲得了一塊長度為“sizeof(int) * 10”長度的內(nèi)存了。為什么這里要寫成“sizeof(int) * 10”的方式呢?因為不同平臺int的長度是不同的,所以使用這種方式更加有利于程序的移植。內(nèi)存申請好之后,接下來的問題是我們該如何來使用這一塊內(nèi)存呢?使用的方式有幾種,第一種方式為使用指針的間接訪問。比如,我們?yōu)橹吧暾埖膬?nèi)存依次賦值0~9,那么使用指針的間接訪問如圖2所示。
C語言動態(tài)內(nèi)存如何分配
圖2 指針間接訪問申請到的內(nèi)存
如圖2的代碼所示,如果利用指針的間接訪問,我們每次都需要定義一個用于存儲當前地址首地址的指針變量。這個指針變量絕對任何時候都不能改變的,一旦改變之后,當我們需要釋放這段內(nèi)存的時候,就無法找到首地址了。
第二種使用這段內(nèi)存的方式為指針的下標引用。圖2同樣的內(nèi)存賦值代碼如圖3所示。
C語言動態(tài)內(nèi)存如何分配

關(guān)于“C語言動態(tài)內(nèi)存如何分配”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI