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

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

     編輯:關於C語言

C 語言內存五大區域

區域特點典型內容
棧區編譯器自動管理,後進先出局部變量、函數參數、返回地址
堆區程序員手動管理(malloc/free/new/delete)動態分配內存
全局/靜態區程序啟動分配,終了釋放全局變量、static 變量(分初始化/未初始化兩塊)
常量區存放字面常量,不可修改字符串字面值 "hello"、const 修飾的全局變量
代碼區只讀,存放二進制指令函數體機器碼

關鍵區別示例

int a = 0;           // 全局初始化區
char *p1;            // 全局未初始化區
void main() {
    int b;           // 棧
    char s[] = "abc";// 棧(數組副本)
    char *p2;        // 棧(指針變量)
    char *p3 = "123456"; // "123456" 在常量區,p3 在棧
    static int c = 0;// 全局/靜態初始化區
    p1 = (char*)malloc(10); // 堆
    p2 = (char*)malloc(20); // 堆
    strcpy(p1, "123456");   // "123456" 在常量區,編譯器可能合併優化
}

C++ 細分:自由存儲區 vs 堆

  • 堆:new/delete 管理,調用構造/析構函數。
  • 自由存儲區:malloc/free 管理,僅分配原始內存。
  • 兩者物理上可能重疊,但語義不同,嚴禁混用(new 必須配 delete,malloc 必須配 free)。

補充說明

  • #define 不佔內存,純文本替換。
  • const 在 C++ 中編譯器常放入符號表(不分配內存),但在 VC 中可能仍分配空間。
  • 函數體外 static 限定文件作用域;函數體內 static 限定函數作用域但生命周期為全程。
本文出自「IT民工一枚」博客,轉載請保留出處:原文鏈接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved