国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

快速搞懂C語言程序內存分區!

信盈達 ? 2025-03-14 17:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在程序運行過程中,操作系統會根據程序的需要,將內存劃分為多個功能不同的區段,以便更高效地管理內存資源和確保程序的穩定運行。不同的內存區段負責存儲不同類型的數據和代碼,涵蓋了從程序指令、全局變量到動態分配的數據等內容。

e95b4440-00b7-11f0-9434-92fbcf53809c.png

(內存分區圖示)

理解這些內存分區的結構和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如段錯誤、內存泄漏、棧溢出等常見問題。以下是常見的六個主要內存分區的詳細解析:


01、棧區(Stack)
存儲內容:

函數參數(如 func(int a, int b) 中的 a 和 b)。局部變量(如函數內定義的 int x = 5;)。函數調用的上下文信息(如返回地址、寄存器備份)。

特性:

自動管理:變量生命周期與作用域綁定(如函數結束時自動釋放)。地址增長方向:向低地址擴展。高效但有限:分配速度快,但空間較小(默認幾 MB)。

典型問題:

棧溢出(如遞歸過深、超大局部數組 int arr[1000000];)。懸掛指針(返回局部變量地址)。

示例代碼:

voidfunc(){

intx=5; //局部變量,存儲在棧區

}

02、堆區(Heap)

存儲內容:動態分配的內存塊(如 malloc、calloc 分配的變量)。

特性:

手動管理:需通過 free 顯式釋放,否則導致內存泄漏。地址增長方向:向高地址擴展,與棧區相對生長。碎片問題:頻繁分配/釋放可能產生內存碎片,降低效率。

典型問題:

野指針(釋放后未置 NULL)。雙重釋放(free 同一指針多次)。

示例代碼:

int*arr=(int*)malloc(100*sizeof(int));

free(arr);

arr=NULL;//避免野指針

03、BSS段(Block Started by Symbol)


存儲內容:

未顯式初始化的全局變量(如 int g_uninit;)。未初始化的靜態變量(如 static int s_uninit;)。

特性:

隱式初始化:程序加載時由系統自動初始化為 0 或 NULL。節省空間:.bss 段不占用磁盤空間,僅在內存中分配。與 .data 區別:.data 存儲非零初始值,而 .bss 存儲默認零值。

示例代碼:

intg_uninit;//存儲在BSS段,自動初始化為0

staticints_uninit;//存儲在BSS段,自動初始化為0

04、數據段(Data Segment)


存儲內容:

已顯式初始化的全局變量(如 int g_var = 10;)。

已初始化的靜態變量(如函數內的 static int s_var = 20;)。

特性:

顯式初始化:必須賦初值(非零值)。

生命周期:從程序啟動到結束(與全局變量一致)。

示例:extern 聲明的全局變量實際指向此區。

示例代碼:

intg_var=10; //存儲在數據段

staticints_var=20;//存儲在數據段

05、常量區(Read-Only Data Segment)

存儲內容:

字符串常量(如 "Hello, World")。const 修飾的全局常量(如 const int MAX = 100;)。浮點數常量、整型常量表等只讀數據。

特性:

運行時不可修改:試圖修改會導致段錯誤(Segmentation Fault)。跨文件共享:同一常量在多個源文件中引用時,僅存儲一份。注意:const 修飾的局部變量不在此區,而是存儲在棧區。

示例代碼:

constintMAX=100;//存儲在常量區

char*msg="Hello";//存儲在常量區

06、代碼段(Text Segment)

存儲內容:編譯后的二進制機器指令(即程序的執行代碼)。

特性:

只讀:禁止修改,防止程序意外篡改指令。可共享:多個進程可同時加載同一份代碼(如動態庫)。示例:函數定義(如 void func() { ... })、控制邏輯(如 if/for 語句的底層實現)。

示例代碼:

voidfunc(){//函數定義存儲在代碼段

printf("Hello");

}

總結

區域存儲內容生命周期常見問題
棧區局部變量、參數、返回地址函數調用期間棧溢出、懸掛指針
堆區動態分配的內存塊malloc 分配到 free 釋放內存泄漏、野指針、雙重釋放
BSS段未初始化的全局和靜態變量程序運行期間
數據段已初始化的全局和靜態變量程序運行期間
常量區字符串常量、const 常量程序運行期間段錯誤
代碼段機器指令程序運行期間段錯誤

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    9

    文章

    3209

    瀏覽量

    76358
  • 操作系統
    +關注

    關注

    37

    文章

    7401

    瀏覽量

    129282
  • C語言程序
    +關注

    關注

    1

    文章

    20

    瀏覽量

    10606
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    C語言使用函數調用的知識點

    C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存中究竟發生了什么真的清楚嗎?只有搞清楚內存里的內幕,才算完全搞懂函數的調用。
    發表于 09-07 11:47 ?1326次閱讀

    一文詳解C語言內存管理

    C語言內存管理指對系統內存的分配、創建、使用這一系列操作。
    發表于 07-26 16:04 ?1083次閱讀
    一文詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>管理

    C語言程序設計中動態內存分配如何實現

    C語言程序設計中,動態內存分配如何實現,需要注意哪些問題?
    發表于 09-28 16:53 ?2251次閱讀

    C語言編程程序內存如何布局

    重點關注以下內容:  C語言程序內存中各個段的組成  C語言
    發表于 09-13 15:04

    單片機C語言程序與數據存儲的相關資料分享

    目錄:一、五大內存分區二、C語言程序的存儲區域三、C語言
    發表于 11-30 06:48

    時鐘設計程序C語言

    時鐘設計程序。時鐘設計程序。時鐘設計程序C語言】時鐘設計程序
    發表于 12-28 12:02 ?0次下載

    程序設計之內存管理

    使用C語言編程時,關于程序設計之內存管理。
    發表于 05-20 17:01 ?0次下載

    存儲器的分區內存管理與分區存儲管理

    內存固定地劃分為若干個大小不等的分區供各個程序使用,每個分區的大小和位置都固定,系統運行期間不再重新劃分。
    發表于 05-26 10:28 ?3577次閱讀
    存儲器的<b class='flag-5'>分區內存</b>管理與<b class='flag-5'>分區</b>存儲管理

    使用單片機實現62256擴展內存C語言程序免費下載

    本文檔的主要內容詳細介紹的是使用單片機實現62256擴展內存C語言程序免費下載。
    發表于 03-16 14:39 ?12次下載

    單片機C語言程序與數據存儲

    目錄:一、五大內存分區二、C語言程序的存儲區域三、C語言
    發表于 11-20 20:36 ?12次下載
    單片機<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b>與數據存儲

    C語言程序編譯后內存地址的分配

    本文目的是簡要介紹C語言編譯得到的可執行文件加載到內存運行時不同變量分配的存儲位置,并通過在Ubuntu 18.04系統和STM32系統上進行編程驗證C
    發表于 01-13 14:23 ?1次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b>編譯后<b class='flag-5'>內存</b>地址的分配

    C語言使用函數調用在內存中究竟發生了什么?

    C語言使用函數調用,我們再熟悉不過了,但是函數調用在內存中究竟發生了什么真的清楚嗎?只有搞清楚內存里的內幕,才算完全搞懂函數的調用。
    的頭像 發表于 01-13 14:09 ?2195次閱讀

    詳解C語言程序內存分區

    每一個C語言程序,都將最終經過這一處理而得到相應的目標文件。
    的頭像 發表于 06-11 17:29 ?2198次閱讀
    詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b><b class='flag-5'>內存</b><b class='flag-5'>分區</b>

    C語言內存問題如何解決

    大家好,我是雜燴君。 C 語言內存問題,難在于定位,定位到了就好解決了。 這篇筆記我們來聊聊踩內存。踩內存,通過字面理解即可。本來是操作這一
    的頭像 發表于 06-22 11:37 ?1085次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>問題如何解決

    C語言內存泄漏問題原理

    內存泄漏問題只有在使用堆內存的時候才會出現,棧內存不存在內存泄漏問題,因為棧內存會自動分配和釋放。C
    發表于 03-19 11:38 ?1199次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內存</b>泄漏問題原理