C語言靜態記憶體分配與動態記憶體分配

2021-10-09 20:54:13 字數 1374 閱讀 1386

c語言中,記憶體主要分為5個區,分別為棧區堆區全域性/靜態儲存區常量儲存區**區

其中**區存放源程式的二進位制**,其餘四個區都儲存程序執行過程中需要的儲存的變數。

變數的記憶體分配有兩種:靜態與動態。

靜態記憶體分配在編譯時就對變數分配空間,而動態記憶體分配直到程式執行時再進行分配。

使用靜態記憶體分配的變數有:全域性變數和靜態變數。

全域性變數是直接在程式中定義而非在函式(包括main函式)中定義的變數。

靜態變數在定義時使用static修飾,靜態變數又分為全域性靜態變數和區域性靜態變數。靜態變數和全域性變數都會在記憶體中儲存直至程式執行結束。值得注意的是區域性靜態變數仍然只在其作用域內有效,而由於其值一直儲存在記憶體中,所以下次在其作用域內使用時,會在「原來值」的基礎上使用,如下例所示:

intf(

)int

main()

}

輸出為:12

345由此可以看出a的值不會因為函式f的銷毀而銷毀,這就是靜態區域性變數的應用。

使用動態分配記憶體的儲存空間有區域性變數儲存,和使用者主動申請的記憶體空間。

區域性變數是在函式內部定義的變數,儲存在棧資料區當中。區域性變數只作用於函式內部,當函式執行結束,就將其分配出去的記憶體再拿回。棧中的記憶體管理由編譯器實現

c語言允許使用者使用malloc等函式自行申請儲存空間,這部分儲存空間從堆資料區開闢。堆中記憶體管理交給使用者。

最後,常量變數使用const修飾,常量資料的值不可更改,也就是說資料區只可讀不可寫。常量儲存在常量資料區當中。

接下來說一說c和c++中,使用者如何申請儲存空間來使用。

c語言使用malloc,realloc和calloc進行記憶體申請。

鏈結有詳細講解:

簡單總結為:

malloc申請一定大小的儲存空間並返回其的指標

calloc在記憶體分配同時初始化記憶體中資料全部為0.

realloc則對已經分配過空間重新進行分配,若後續空間充足則分配給之,若不充足則重新開闢乙個空間,並將資料拷貝至新的空間內,最後返回新分配的位址。

在使用上述函式申請記憶體空間後,一定要檢查是否分配成功(分配失敗則返回空指標)

記憶體區使用完(之後不再需要這部分資料)後,一定要將其記憶體空間釋放,否則會造成記憶體洩漏。free函式完成釋放任務。

c++記憶體申請和釋放主要是用new和delete完成,細節就不講了。

C語言 靜態記憶體分配和動態記憶體分配

靜態記憶體是直接變數等於什麼什麼。malloc int 返回值為記憶體位址,記憶體位址長度為4個位元組 指標的長度 一般先申明乙個指標不對他進行賦值,用malloc int 返回值賦給這個指標,手動申請的記憶體用free temp指標名 函式 陣列第一次分配的記憶體還是不夠用時,使用realloc ...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

靜態記憶體分配和 動態記憶體分配

1 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源 動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源 2 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的 3 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要 4 靜態分配記憶體需要在編譯前確定記憶...