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

C/C++ 程序內存佈局詳解:棧、堆、全局區、常量區、代碼區

     編輯:關於C語言

程序內存五大區域

一個由 C/C++ 編譯的程序在運行時佔用的內存主要分為以下五個部分:

1. 棧區

  • 由編譯器自動分配釋放。
  • 存放函數參數、局部變量、返回地址等。
  • 操作方式類似數據結構中的棧(先進後出)。
  • 空間有限(如 VC6 默認 1MB),向低地址增長。

2. 堆區

  • 由程序員手動分配(malloc/new)與釋放(free/delete)。
  • 若不釋放,程序結束時由 OS 回收。
  • 分配方式類似鏈表,易產生內存碎片。
  • 空間大,32 位系統可達近 4GB,向高地址增長。

3. 全局/靜態區

  • 存放全局變量與靜態變量(static)。
  • 分為初始化區(.data/.rwdata)與未初始化區(.bss),相鄰存放。
  • 程序結束由系統釋放。

4. 文字常量區

  • 存放字符串字面量(如 "abc")。
  • 通常為只讀(.rodata),程序結束由系統釋放。

5. 程序代碼區

  • 存放函數體的二進制機器碼(.text)。
  • 只讀,通常可共享。

示例程序與內存分佈

[cpp]
// main.cpp
int a = 0;               // 全局初始化區 (.data)
char *p1;                // 全局未初始化區 (.bss)

int main() {
    int b;               // 棧區
    char s[] = "abc";    // "abc" 在常量區,s 在棧
    char *p2;            // 棧區
    char *p3 = "123456"; // "123456" 在常量區,p3 在棧
    static int c = 0;    // 全局/靜態初始化區 (.data)

    p1 = (char*)malloc(10); // 堆區
    p2 = (char*)malloc(20); // 堆區
    strcpy(p1, "123456");   // "123456" 在常量區,編譯器可能優化合併
    return 0;
}

堆與棧的詳細對比

維度棧堆
管理方式編譯器自動程序員手動
空間大小較小(~1MB)極大(~4GB)
碎片問題無(LIFO)易產生碎片
生長方向向低地址向高地址
分配效率極高(專用指令)較低(需搜索/系統調用)

Global 與 Static 討論

  • static 全局變量:僅在定義文件內可見,降低耦合。
  • static 局部變量:改變存儲方式(從棧移至靜態區),延長生命周期,僅初始化一次。
  • static 函數:僅在本文件內可見(內部函數),避免名稱衝突。

總結

理解內存佈局有助於排查野指針、內存洩漏、棧溢出等問題,也是編寫高性能、穩健 C/C++ 代碼的基礎。

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