C 程式的記憶體結構

2021-09-12 06:59:11 字數 1003 閱讀 2159

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

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); //堆

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

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

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

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

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

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

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

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

在sw-at 這張圖中所示記憶體空間,位址由下往上增長,分別標示了 .text、.data、.bss、stack和heap的記憶體分部情況。 

我們可以看到:

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 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。未初...