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

C/C++ 程序內存佈局詳解:棧、堆、數據段與代碼段

     編輯:關於C語言

C/C++ 程序內存佈局詳解:棧、堆、數據段與代碼段

理解程序在內存中的分佈,是掌握指針、動態分配、作用域與生命週期的基石。本文系統梳理 C/C++ 進程虛擬地址空間的五大區域,並對比它們的特性、管理方式與典型用例。

進程虛擬地址空間五大區域

由高地址向低地址依次為:

  1. 棧區:向下增長,存放函數參數、局部變量、返回地址、幀指針等。由編譯器自動管理,極快但容量有限(通常 1~8 MB),棧溢出是常見崩潰原因。
  2. 堆區:向上增長,供 malloc/free、new/delete 動態分配。程序員手動管理,靈活但易產生碎片、洩漏;頻繁分配釋放會影響性能。
  3. 非初始化數據段:存放未顯式初始化的全局/靜態變量。程序啟動時由內核清零(零頁映射),不佔用可執行文件體積。
  4. 初始化數據段:存放已賦初值的全局/靜態變量(含 const 全局)。隨可執行文件加載,佔用文件體積。
  5. 代碼段:存放 CPU 執行的機器指令,通常為只讀、可共享。包含字面常量(如字符串常量)只讀副本。

關鍵對比表

區域管理者增長方向存放內容生命週期
棧編譯器高→低局部變量、參數、返回值、調用幀函數調用期間
堆程序員低→高動態分配內存手動釋放或程序結束
BSS系統固定未初始化全局/靜態變量程序全程
Data系統固定已初始化全局/靜態變量程序全程
Text系統固定機器碼、字面常量程序全程

常見誤區與最佳實踐

  • 局部變量指針返回:函數返回棧上局部變量地址屬未定義行為,因棟幀銷毀後內存失效。
  • 大對象放棧:大陣列、結構體應動態分配至堆,避免棧溢出。
  • 內存洩漏:每個 malloc 必須配對 free,RAII 智能指針可自動化管理。
  • 字符串常量修改:char *p = "abc"; p[0]='x'; 導致段錯誤,因常量駐留只讀代碼段。應用 char p[] = "abc"; 放棧上。

驗證工具

  • size 查看段大小:size a.out
  • pmap 觀察運行時映射:pmap PID
  • valgrind 檢測堆錯誤:valgrind --leak-check=full ./prog

熟練掌握內存佈局,能讓你寫出更安全、高效、可移植的系統級代碼。

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