對於初學c語言學者,理解c程記憶體布局對於我們理解與運用指標非常重要,在筆試中也經常有考題涉及到。
以下測試在虛擬機器ubuntu18.04下的測試結果,在樹莓派(arm處理器)測試不同之處也會指出。
1.程式各段記憶體遵循上圖順序記憶體布局:
結果如下圖:
把位址在圖上標出:
(圖中最低位址和最高位址只是表明記憶體方向)
由上圖看出,棧區在堆區的上面,bss段和資料段data、唯讀資料段rodata按順序存放在記憶體中。唯一區別是命令列引數區的位址比棧區的小,但是比堆區的位址大,所以命令列引數區存放在棧區與堆區中間。
我們在32位樹莓派上測試:
可以看到命令列引數區記憶體也是在棧區與堆區的中間。
在理論上,棧區的增長方向是向下,堆區是向上,下面在ubuntu下測試結果:
結果分析出,棧區和堆區都是自低位址向高位址增長的,下面我們在樹莓派上測試看;
可以看出,在樹莓派上測試結果與在ubuntu下測試結果不同:棧的增長方向是自上而下,堆的增長是自下而上的。
測試**:
# include # include # include int g_bss_test;
int g_data_value = 10;
char *ptr = "hello word";
int main (int agrv, char **argc)
樹莓派下測試**:
#include #include int main(int ar**, char **argc)
c 程式的記憶體布局
對任何乙個普通c 程式來講,它都會涉及到 5種不同的資料段。常用的幾個資料段種包含有 程式 段 程式資料段 程式堆疊段 等。不錯,這幾種資料段都在其中,但除了以上幾種資料段之外,程序還另外包含兩種資料段。下面我們來簡單歸納一下程序對應的記憶體空間中所包含的 5種不同的資料區。段 段是用來存放可執行檔...
C程式的記憶體布局
c程式的記憶體布局 c程式的典型記憶體表示由以下部分組成 1.文字段 cpu 執行的機器指令 2.初始化資料段 資料段 3.未初始化的資料段 也稱bss段 4.棧 自動變數以及每次函式呼叫時所需儲存的的資訊都放在棧中 5.堆 通常在堆中進行動態儲存分配 如下圖所示 測試 include includ...
C程式的記憶體布局
乙個c程式一直以來都是由以下5個段 pieces 組成 正文段。這是由cpu執行的機器指令部分。通常,正文段是可共享的,所以即使執行的程式 如文字編輯程式 c編譯程式 shell等 在儲存器中也只需有乙個副本 否則會造成資源浪費,試想如果開同樣的程式100個,每個正文段都要乙個相同副本 另外,正文段...