C語言儲存格式

2021-10-03 08:36:04 字數 917 閱讀 7519

在c程式中我們定義變數,定義函式,寫的邏輯語句,用malloc()函式申請的neic記憶體,那麼這些東西在記憶體中都是怎麼存放的呢?

我們將乙個程式或多個程式編譯為乙個可執行檔案,那麼這個可執行檔案在記憶體中是怎麼存放的,首先它肯定不是將一對程式雜糅在一起,而是把記憶體分為幾個區間,不同的區間存放不同的東西。

在馮諾依曼的體系結構中乙個程序必須有**段,堆疊段,資料段。

高位址低位址

更細緻一點可分為:

.text:        **段

.rodata:    const變數;字串

.data:       已初始化的全域性變數,已初始化的靜態變數。陣列、結構體也是(它們也屬於變數)。

.bss:         未初始化或初始化為0的全域性變數; 未初始化或初始化為0靜態變數。陣列、結構體也是(屬於變數)。

stack:       函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。

除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,

函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。

從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

heap:       由程式設計師分配或釋放

說明:.bss不占用編譯生成的.bin空間,.bin裡邊只有.text,.data,.rodata。

.bss段會被清零,uboot在初始化時會清.bss段。

堆疊裡的變數是動態的,程式沒執行時他們不存在。

#include int a=123; //a在全域性已初始化資料區 

char *p1; //p1在bss區(未初始化全域性變數)

int main()

C語言 儲存

char 字元資料型別 short 短整型 int 整形 long 長整型 long long 更長的整形 float 單精度浮點數 double 雙精度浮點數 型別的基本歸類 整型家族 浮點數家族 構造型別 指標型別 空型別 這裡再將構造型別細分一下 陣列型別 結構體型別struct 列舉型別en...

C語言列印格式

d 輸出乙個有符號的10進製int型別 o 輸出8進製的int型別 x 輸出16進製制的int型別,字母以小寫輸出 x 輸出16進製制的int型別,字母以大寫輸出 u 輸出乙個10進製的無符號數 l 輸出long型別 ll 輸出long long型別 lu 輸出unsigned long型別 llu...

c語言變數儲存

記憶體中供使用者使用的儲存空間分為 區與資料區兩個部分。變數儲存在資料區,資料區又可分為靜態儲存區與動態儲存區。靜態儲存是指在程式執行期間給變數分配固定儲存空間的方式。如全域性變數存放在靜態儲存區中,程式執行時分配空間,程式執行完釋放。動態儲存是指在程式執行時根據實際需要動態分配儲存空間的方式。如形...