chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

快速搞懂C語言程序內(nèi)存分區(qū)!

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

掃碼添加小助手

加入工程師交流群

在程序運(yùn)行過程中,操作系統(tǒng)會(huì)根據(jù)程序的需要,將內(nèi)存劃分為多個(gè)功能不同的區(qū)段,以便更高效地管理內(nèi)存資源和確保程序的穩(wěn)定運(yùn)行。不同的內(nèi)存區(qū)段負(fù)責(zé)存儲(chǔ)不同類型的數(shù)據(jù)和代碼,涵蓋了從程序指令、全局變量到動(dòng)態(tài)分配的數(shù)據(jù)等內(nèi)容。

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

(內(nèi)存分區(qū)圖示)

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


01、棧區(qū)(Stack)
存儲(chǔ)內(nèi)容:

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

特性:

自動(dòng)管理:變量生命周期與作用域綁定(如函數(shù)結(jié)束時(shí)自動(dòng)釋放)。地址增長(zhǎng)方向:向低地址擴(kuò)展。高效但有限:分配速度快,但空間較?。J(rèn)幾 MB)。

典型問題:

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

示例代碼:

voidfunc(){

intx=5; //局部變量,存儲(chǔ)在棧區(qū)

}

02、堆區(qū)(Heap)

存儲(chǔ)內(nèi)容:動(dòng)態(tài)分配的內(nèi)存塊(如 malloc、calloc 分配的變量)。

特性:

手動(dòng)管理:需通過 free 顯式釋放,否則導(dǎo)致內(nèi)存泄漏。地址增長(zhǎng)方向:向高地址擴(kuò)展,與棧區(qū)相對(duì)生長(zhǎng)。碎片問題:頻繁分配/釋放可能產(chǎn)生內(nèi)存碎片,降低效率。

典型問題:

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

示例代碼:

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

free(arr);

arr=NULL;//避免野指針

03、BSS段(Block Started by Symbol)


存儲(chǔ)內(nèi)容:

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

特性:

隱式初始化:程序加載時(shí)由系統(tǒng)自動(dòng)初始化為 0 或 NULL。節(jié)省空間:.bss 段不占用磁盤空間,僅在內(nèi)存中分配。與 .data 區(qū)別:.data 存儲(chǔ)非零初始值,而 .bss 存儲(chǔ)默認(rèn)零值。

示例代碼:

intg_uninit;//存儲(chǔ)在BSS段,自動(dòng)初始化為0

staticints_uninit;//存儲(chǔ)在BSS段,自動(dòng)初始化為0

04、數(shù)據(jù)段(Data Segment)


存儲(chǔ)內(nèi)容:

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

已初始化的靜態(tài)變量(如函數(shù)內(nèi)的 static int s_var = 20;)。

特性:

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

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

示例:extern 聲明的全局變量實(shí)際指向此區(qū)。

示例代碼:

intg_var=10; //存儲(chǔ)在數(shù)據(jù)段

staticints_var=20;//存儲(chǔ)在數(shù)據(jù)段

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

存儲(chǔ)內(nèi)容:

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

特性:

運(yùn)行時(shí)不可修改:試圖修改會(huì)導(dǎo)致段錯(cuò)誤(Segmentation Fault)。跨文件共享:同一常量在多個(gè)源文件中引用時(shí),僅存儲(chǔ)一份。注意:const 修飾的局部變量不在此區(qū),而是存儲(chǔ)在棧區(qū)。

示例代碼:

constintMAX=100;//存儲(chǔ)在常量區(qū)

char*msg="Hello";//存儲(chǔ)在常量區(qū)

06、代碼段(Text Segment)

存儲(chǔ)內(nèi)容:編譯后的二進(jìn)制機(jī)器指令(即程序的執(zhí)行代碼)。

特性:

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

示例代碼:

voidfunc(){//函數(shù)定義存儲(chǔ)在代碼段

printf("Hello");

}

總結(jié)

區(qū)域存儲(chǔ)內(nèi)容生命周期常見問題
棧區(qū)局部變量、參數(shù)、返回地址函數(shù)調(diào)用期間棧溢出、懸掛指針
堆區(qū)動(dòng)態(tài)分配的內(nèi)存塊malloc 分配到 free 釋放內(nèi)存泄漏、野指針、雙重釋放
BSS段未初始化的全局和靜態(tài)變量程序運(yùn)行期間
數(shù)據(jù)段已初始化的全局和靜態(tài)變量程序運(yùn)行期間
常量區(qū)字符串常量、const 常量程序運(yùn)行期間段錯(cuò)誤
代碼段機(jī)器指令程序運(yùn)行期間段錯(cuò)誤

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75270
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7152

    瀏覽量

    125591
  • C語言程序
    +關(guān)注

    關(guān)注

    1

    文章

    20

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語言使用函數(shù)調(diào)用的知識(shí)點(diǎn)

    C語言使用函數(shù)調(diào)用,我們?cè)偈煜げ贿^了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的調(diào)用。
    發(fā)表于 09-07 11:47 ?1042次閱讀

    一文詳解C語言內(nèi)存管理

    C語言內(nèi)存管理指對(duì)系統(tǒng)內(nèi)存的分配、創(chuàng)建、使用這一系列操作。
    發(fā)表于 07-26 16:04 ?858次閱讀
    一文詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>管理

    C語言程序設(shè)計(jì)中動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn)

    C語言程序設(shè)計(jì)中,動(dòng)態(tài)內(nèi)存分配如何實(shí)現(xiàn),需要注意哪些問題?
    發(fā)表于 09-28 16:53 ?1778次閱讀

    C語言編程程序內(nèi)存如何布局

    重點(diǎn)關(guān)注以下內(nèi)容:  C語言程序內(nèi)存中各個(gè)段的組成  C語言
    發(fā)表于 09-13 15:04

    單片機(jī)C語言程序與數(shù)據(jù)存儲(chǔ)的相關(guān)資料分享

    目錄:一、五大內(nèi)存分區(qū)二、C語言程序的存儲(chǔ)區(qū)域三、C語言
    發(fā)表于 11-30 06:48

    時(shí)鐘設(shè)計(jì)程序C語言

    時(shí)鐘設(shè)計(jì)程序。時(shí)鐘設(shè)計(jì)程序。時(shí)鐘設(shè)計(jì)程序C語言】時(shí)鐘設(shè)計(jì)程序
    發(fā)表于 12-28 12:02 ?0次下載

    程序設(shè)計(jì)之內(nèi)存管理

    使用C語言編程時(shí),關(guān)于程序設(shè)計(jì)之內(nèi)存管理。
    發(fā)表于 05-20 17:01 ?0次下載

    存儲(chǔ)器的分區(qū)內(nèi)存管理與分區(qū)存儲(chǔ)管理

    內(nèi)存固定地劃分為若干個(gè)大小不等的分區(qū)供各個(gè)程序使用,每個(gè)分區(qū)的大小和位置都固定,系統(tǒng)運(yùn)行期間不再重新劃分。
    發(fā)表于 05-26 10:28 ?3376次閱讀
    存儲(chǔ)器的<b class='flag-5'>分區(qū)內(nèi)存</b>管理與<b class='flag-5'>分區(qū)</b>存儲(chǔ)管理

    使用單片機(jī)實(shí)現(xiàn)62256擴(kuò)展內(nèi)存C語言程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)62256擴(kuò)展內(nèi)存C語言程序免費(fèi)下載。
    發(fā)表于 03-16 14:39 ?12次下載

    單片機(jī)C語言程序與數(shù)據(jù)存儲(chǔ)

    目錄:一、五大內(nèi)存分區(qū)二、C語言程序的存儲(chǔ)區(qū)域三、C語言
    發(fā)表于 11-20 20:36 ?12次下載
    單片機(jī)<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b>與數(shù)據(jù)存儲(chǔ)

    C語言程序編譯后內(nèi)存地址的分配

    本文目的是簡(jiǎn)要介紹C語言編譯得到的可執(zhí)行文件加載到內(nèi)存運(yùn)行時(shí)不同變量分配的存儲(chǔ)位置,并通過在Ubuntu 18.04系統(tǒng)和STM32系統(tǒng)上進(jìn)行編程驗(yàn)證C
    發(fā)表于 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'>內(nèi)存</b>地址的分配

    C語言使用函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么?

    C語言使用函數(shù)調(diào)用,我們?cè)偈煜げ贿^了,但是函數(shù)調(diào)用在內(nèi)存中究竟發(fā)生了什么真的清楚嗎?只有搞清楚內(nèi)存里的內(nèi)幕,才算完全搞懂函數(shù)的調(diào)用。
    的頭像 發(fā)表于 01-13 14:09 ?1595次閱讀

    詳解C語言程序內(nèi)存分區(qū)

    每一個(gè)C語言程序,都將最終經(jīng)過這一處理而得到相應(yīng)的目標(biāo)文件。
    的頭像 發(fā)表于 06-11 17:29 ?1722次閱讀
    詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>分區(qū)</b>

    C語言內(nèi)存問題如何解決

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

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?b class='flag-5'>內(nèi)存會(huì)自動(dòng)分配和釋放。C
    發(fā)表于 03-19 11:38 ?848次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>內(nèi)存</b>泄漏問題原理