C語言高階剖析 40 程式的記憶體布局

2021-10-01 19:02:44 字數 1171 閱讀 7060

寫完的 .c 檔案是原始檔。也叫源**。

將源**編譯後,會生成可執行檔案程式(linux下是.out,windows下是.exe)。這個檔案就是程式。也叫作可執行**。

源**與可執行檔案的對應如下,也就是程式檔案的布局:

可以看到,程式被編譯器編譯過後:

前面一直說可執行程式,那麼可執行程式在執行前和執行後有什麼差異呢?,下面來看看程式與程序。

程式與程序不同

指令碼檔案是乙個文字檔案,我們經常會說執行某個指令碼檔案。其實指令碼**是一種可執行程式,但不是一種直接的可執行程式,既然是可執行程式一定對應程序,對應的是什麼程序呢,下面來說:

乙個可執行程式被作業系統載入執行後就得到了乙個程序。對於 window 系統,雙擊乙個 .exe 檔案,作業系統載入這個檔案,就得到乙個程序。對於 linux 通過命令列載入,和 window 原理一樣。這個程序的功能是確定的。

對於指令碼檔案,作業系統首先檢視指令碼檔案對應的指令碼解釋程式,然後載入指令碼解釋程式,就得到了程序,這個程序會反過來讀取指令碼檔案,這個程序的功能是不確定的,取決於它讀取並解釋的執行的指令碼檔案。指令碼檔案不能直接被作業系統載入,需要載入指令碼解釋程式得到程序,這樣乙個指令碼檔案最終還是對應了乙個程序。

可執行程式和載入後程序的布局如下:

file header 是告訴作業系統如何執行這個程式,所以載入後程序中就沒有 file header 了。

各個段的作用:

問題:同時全域性變數和靜態變數,為什麼初始化和未初始化的儲存在不同段中?

1、程式原始碼在編譯後對應可執行程式中的不同儲存區

2、程式是靜態概念,程序是動態概念

3、堆疊段是程式執行的基礎,只存在於程序空間中

4、程式可執行**存放於 .text 段,是唯讀的

5、.bss 和 .data 段用於儲存全域性變數個靜態變數

《C語言高階剖析》課程目錄

第1課 基本資料型別 第2課 有符號數與無符號數 第3課 浮點數的秘密 第4課 型別轉換 第5課 變數屬性 第6課 分支語句 第7課 迴圈語句 第8課 goto和void分析 第9課 const 和 volatile分析 第10課 struct和union分析 第11課 enum,sizeof,ty...

C語言高階剖析 07 迴圈語句

迴圈語句分析 do while 的迴圈方式 程式設計實驗 三種迴圈語句使用對比 include int f1 int n while n 0 return ret int f2 int n return ret int f3 int n printf d i printf n void f2 int...

C語言高階剖析 7 迴圈語句

迴圈語句通過條件表示式判定是否執行迴圈體。迴圈語句有三種,do,while,for,三種區別如下 1 do while 語句的迴圈方式 2 while 語句的迴圈方式 3 for 語句的迴圈方式 for 迴圈有初始區,i 0 就是初始區 condition 是條件 迴圈終止區指的是 i 程式示例 三...