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

C語言堆與棧深度對比:內存佈局、增長方向、管理方式、生命週期與經典代碼驗證

     編輯:關於C語言

棧

  • 系統管理,向下增長(地址遞減),連續區域,大小固定(如主線程 8MB)。
  • 函數調用入棧順序:返回地址 → 參數 → 局部變量(靜態變量不入棧)。
  • 調用結束出棧:局部變量 → 參數 → 恢復返回地址。

堆

  • 程序員管理(malloc/free/new/delete),向上增長,不連續(鏈表管理)。
  • 大小受虛擬內存限制,遠大於棧。
  • 內容由程序員安排,適合長生命週期、大塊、動態尺寸對象。

經典代碼驗證內存分區

int a = 0;            // 全局初始化區 (.data)
char *p1;             // 全局未初始化區 (.bss)
main() {
    int b;            // 棧
    char s[]="abc";   // 棟
    char *p2;         // 棧
    char *p3="123456";// 字符串常量區(.rodata),p3在棧
    static int c=0;   // 全局/靜態初始化區
    p1 = malloc(10);  // 堆
    p2 = malloc(20);  // 堆
}

字符串字面值去重驗證

char *p1="helloworld";
char *p2="helloworld";
char p3[]="helloworld";
char p4[]="helloworld";
printf("%p %p %p %p", p1, p2, p3, p4);
// 輸出:p1==p2 (常量區去重),p3!=p4 (棧上獨立副本)

指針指向同一常量區地址,數組各自在棧複製內容。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved