程序的堆疊空間

2021-05-26 09:56:23 字數 864 閱讀 4727

每乙個程序都有自己的乙個程序堆疊空間。在linux介面執行乙個執行碼時,shell程序會fork乙個子程序,再呼叫exec系統呼叫在子程序中執行該執行碼。

exec系統呼叫執行新程式時會把命令列引數和環境變數表傳遞給main函式,它們在整個程序堆疊空間中的位置如下圖12-7所示。

圖12-7 程序堆疊空間圖

下面是對圖12-7程序堆疊空間各段的具體說明: ①

**段(文字段):儲存程式的執行碼。在程序併發時,**段是共享的且唯讀的,在儲存器中只需有乙個副本。

②資料段:此段又稱為初始化資料段,它包含了程式中已初始化的全域性變數、全域性靜態變數、區域性靜態變數。

例如,函式外定義的變數並賦值:

intcount=30 ;

此變數count

存放在資料段中。

③bss

段:通常此段又稱為未初始化資料段,它包含了程式中未初始化的全域性變數、全域性靜態變數、區域性靜態變數,程式執行前作業系統將此段初始化為0。

例如,函式外定義的變數但沒有賦值:

long sum[1000] ;

此變數存放在

bss段中。

④棧:程式執行前靜態分配的記憶體空間,棧的大小可在編譯時指定,

linux

環境下預設為

8m。棧段是存放程式執行時區域性變數、函式呼叫資訊、中斷現場保留資訊的空間。程式執行時,

cpu堆疊段指標會在棧頂根據執**況進行上下移動。

⑤堆:程式執行時,按照程式需要動態分配的記憶體空間。

malloc

、calloc

、realloc

函式分配的空間都在堆上分配。

摘自《深入淺出linux工具與程式設計》  

linux 使用者程序額堆疊空間VMA

linux 堆疊expand stack bprm mm init 0xbe86f000 0xbe871000 address 0xbe84f000 int expand downwards struct vm area struct vma,unsigned long address int er...

變數空間分配 堆 棧

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

C 的記憶體空間 堆疊

c 記憶體空間布局圖示對照。命令列引數和環境變數 stack 棧heap 堆bss 未初始化資料段 data 初始化資料段 text 正文段linux下32位記憶體空間分布圖。1.命令列引數和環境變數 shell在執行程式的時候呼叫exec函式將命令列引數傳遞給要執行的程式。使程式了解程序環境,在執...