全域性變數,靜態變數以及區域性變數存放位置

2021-06-16 19:22:47 字數 1012 閱讀 5743

一般工程編譯完成後會生成.o 檔案 然後通過link 成乙個完整的映象

可執行程式包括bss段、

資料段、

**段(也稱文字段)。

bss(block started by symbol)通常是指用來存放程式中未初始化的

全域性變數和

靜態變數的一塊記憶體區域。特點是:可讀寫的,在程式執行之前bss段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。

注意和 資料段的區別,bss存放的是未初始化的

全域性變數和

靜態變數,資料段存放的是初始化後的全域性變數和靜態變數。

unix下可使用size命令檢視可執行檔案的段大小資訊。如size a.out。

elf 檔案一般包含 一下幾個**段 :

file header欄位裡存放了描述整個檔案的基本屬性資訊的內容,如程式入口位址,其他各段資訊(偏移量和範圍)

.text section:主要是編譯後的原始碼指令,是唯讀字段。

.data section :初始化後的非const的全域性變數變數或者區域性static變數。

.bss:未初始化後的非const全域性變數和區域性static變數

rodata欄位  是存放唯讀資料

common   存放注釋的

堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減) 

棧(stack):棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。 

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

全域性變數,全域性靜態變數,區域性靜態變數,區域性變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...