C 程式的記憶體結構

2021-09-28 12:36:57 字數 2326 閱讀 9895

問題引出:在看一些資料部落格的時候說執行緒共享同乙個程序的**段和資料段,又有說法是**段和資料段在可執行檔案中載入,比較疑惑,下面稍微具體的整理一下。

int a =0;

//全域性初始化區

char

*p1;

//全域性未初始化區

main()

{int b;

//棧

char s=

"abc"

;//棧

char

*p2;

//棧

char

*p3 =

"123456"

;//123456\0在常量區,p3在棧上。

static

int c =

0; //全域性(靜態)初始化區

p1 =

(char*)

malloc(10

);//堆

p2 =

(char*)

malloc(20

);//堆

動&靜乙個程式被載入到記憶體中,這塊記憶體首先就存在兩種屬性:靜態分配記憶體和動態分配記憶體。

靜態分配記憶體:是在程式編譯和鏈結時就確定好的記憶體。

動態分配記憶體:是在程式載入、調入、執行的時候分配/**的記憶體。

text & data & bss(**段、初始化資料、未初始化資料)

.text: 也稱為**段(code),用來存放程式執行**,同時也可能會包含一些常量(如一些字串常量等)。該段記憶體為靜態分配,唯讀(某些架構可能允許修改)。

這塊記憶體是共享的,當有多個相同程序(process)存在時,共用同乙個text段。

.data:也有的地方叫**ar(global value),用來存放程式中已經初始化的非零全域性變數。靜態分配。

data又可分為讀寫(rw)區域和唯讀(ro)區域。

-> ro段儲存常量所以也被稱為.constdata eg const資料

-> rw段則是普通非常全域性變數,靜態變數就在其中

.bss:存放程式中未初始化的和零值全域性變數。靜態分配,在程式開始時通常會被清零。

其中**.bss和.data合稱為資料段**

text和data段都在可執行檔案中,由系統從可執行檔案中載入;而bss段不在可執行檔案中,由系統初始化。

這三段記憶體就組成了我們編寫的程式的本體,但是乙個程式執行起來,還需要更多的資料和資料間的互動,否則這個程式就是死的,無用的。所以我們還需要為更多的資料和資料互動提供一塊記憶體——堆疊。

堆疊(heap& stack)

堆和棧都是動態分配記憶體,兩者空間大小都是可變的。

stack:棧,存放automatic variables,按記憶體位址由高到低方向生長,其最大大小由編譯時確定,速度快,但自由性差,最大空間不大。儲存程式中的區域性變數(也就是在**塊中的變數)這樣的變數伴隨著函式的呼叫和終止,在記憶體中也相應的增加或者減少。這樣的變數在建立時期按順序加入,在消亡的時候按相反的順序移除。 (來自另一片部落格解釋:由編譯器自動分配釋放,存放函式的引數的值,區域性變數的值等。在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區 域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m(也有的是1m,總之是乙個編譯時就確定的常數), 如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小)

heap:堆,自由申請的空間,按記憶體位址由低到高方向生長,其大小由系統記憶體/虛擬記憶體上限決定,速度較慢,但自由性大,可用空間大。 動態分配的內存在呼叫malloc()或者相關函式產生,在呼叫free()時釋放,由程式設計師而不是一系列固定的規則記憶體持續時間,因此記憶體塊可在乙個函式中建立,在另乙個函式中釋放。由於這點,動態記憶體分配所使用的部分可能就碎片,也就是說:在活動的記憶體塊之間散布著未使用的記憶體片。動態分配記憶體往往要比棧分配的記憶體慢(一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由系統** 。它與資料結構中的堆是兩回事。堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶 的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。)

每個執行緒都會有自己的棧,但是堆空間是共用的。

C 程式的記憶體結構

問題引出 在看一些資料部落格的時候說執行緒共享同乙個程序的 段和資料段,又有說法是 段和資料段在可執行檔案中載入,比較疑惑,下面稍微具體的整理一下。int a 0 全域性初始化區 char p1 全域性未初始化區 main int b 棧 char s abc 棧 char p2 棧 char p3...

C程式記憶體結構

c程式記憶體結構 乙個32位的執行在保護模式下應用程式 無論是linux 還是windows 都給它分配乙個4gb的平坦的記憶體空間 乙個執行著的c程式所占用的記憶體空間分為 區 初始化資料區 未初始化資料區 堆區 和 棧區 在位址上從高位到地位為 高位 棧區堆區 未初始化資料區 即bbs 資料區 ...

C 程式記憶體結構

標籤 空格分隔 c 記憶體 棧區 stack 又編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。堆區 heap 一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。未初...