C 五種記憶體分配區域

2021-09-13 14:29:15 字數 1066 閱讀 2942

變數的記憶體空間主要有以下幾個:堆(heap)、棧(stack)、全域性靜態區、常量區、**區

heap:不連續的記憶體區域,由開發者自行進行開闢和釋放。如果程式結束時沒有進行釋放、作業系統會對其進行管理。開發者通過new/malloc等建立存放在heap上的變數,通過delete/free對他們進行刪除。它與資料結構中的堆是兩回事,分配方式類似於鍊錶。

stack:和堆不同,它是連續的記憶體空間。由編譯器進行分配和**等管理。一般存放函式的引數、區域性變數等。

全域性靜態區:存放全域性變數和靜態變數。全域性變數在main方法之前宣告,作用域是整個工程,在定義的本檔案內直接使用,而其他的檔案加上extern關鍵字宣告後,也可以使用(靜態全域性變數的作用域只有定義的檔案)。靜態變數由static關鍵字宣告,他的作用域只在定義的檔案,被static關鍵字修飾過的變數具有檔案作用域,外部的檔案不能用extern的方式進行使用。

常量區:存放常量,像const宣告的變數、或者字串常量就儲存在這個記憶體空間中。

**區:也叫**段,存放程式的二進位制**。

#include #include int a = 0; // 全域性初始化區

char* p1; // 全域性未初始化區

int main()

對於堆,應知道系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式申請時,遍歷該鍊錶,尋找第乙個空間大於申請空間的堆結點,刪除空閒結點鍊錶中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首位址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外系統會將多餘的部分重新放入空閒鍊錶中)。

對於棧,只要棧的剩餘空間大於所申請空間,系統為程式提供記憶體,否則報異常提示棧溢位。

對於堆,頻繁的new/delete會造成大量碎片,使程式效率降低。

對於棧,它是乙個先進後出的佇列,進出一一對應,不會產生碎片。

(這決定了棧在高位址區、堆在底位址區)

堆向上,向高位址方向增長。

棧向下,向低位址方向增長。

堆是動態分配的。棧可以是靜態分配和動態分配兩種,但是棧的動態分配由編譯器釋放。

堆由c/c++函式庫提供,機制很複雜。所以堆的效率比棧低很多。

c 五種記憶體分配

在c 中,記憶體分為5個區域。分別是堆,棧,自由儲存區,全域性 靜態儲存區和常量儲存區 棧 由編譯器在需要的時候分配,在不需要的時候自動清除的變數儲存區。裡面通常是區域性變數,函式引數等。堆 由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new對應乙個delete。...

C 記憶體分配的五種方法

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

C 中記憶體的五種分配方式

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...