首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言記憶體佈局實測:堆疊向下增長、陣列元素遞增、編譯器配置策略揭秘

     編輯:關於C語言

經典五區模型(高位 → 低位)

  1. 堆疊 —— 區域變數、參數、返回位址,向下增長
  2. 堆區 —— 動態記憶體,向上增長
  3. 未初始化資料區 .bss
  4. 已初始化資料區 .data
  5. 程式碼區 .text

堆疊分配實測(macOS/Linux 64-bit)

int a=0, b=0; int arr[5]={1,2,3,4,5};
printf("&a=%p &b=%p arr=%p", &a, &b, arr);
// 輸出:
// &a=0x7fff5fbff944
// &b=0x7fff5fbff940
// arr=0x7fff5fbff920
// 先宣告的 a 位址較高,後宣告的 b、arr 位址較低 → 堆疊向下增長

陣列元素位址遞增

for (int i=0;i<5;i++) printf("&arr[%d]=%p", i, &arr[i]);
// &arr[0]=0x7fff5fbff920
// &arr[1]=0x7fff5fbff924
// ...  每項 +4 bytes(int),位址遞增

編譯器「批次配置」策略造成間隙

觀察 &arr[4]=0x7fff5fbff930、&b=0x7fff5fbff940,中間相差 16 bytes(4 個 int)。原因:編譯器以**單次配置單位 = 最大區域變數大小**(此例 arr[5] = 20B),先配 20B 給 a,b(共 8B),剩 12B 不足放 arr,再配一塊 20B 給 arr,產生 12B 間隙。

圖解記憶體佈局

堆疊記憶體佈局圖

啟示

  • 區域變數宣告順序影響位址分佈,但語意不應依賴此順序
  • 大型陣列盡量靠前宣告或改用動態配置,減少堆疊碎片
  • 理解配置策略有助於除錯堆疊溢位、緩衝區溢出問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved