C語言-變量存儲方式
時(shi)間(jian):2025-01-16 來源:華清(qing)遠見
程序段的內存布局
在C程序(xu)中,內(nei)存通常分(fen)為幾個主要區域:
1. 代碼段(.text段) - 存放(fang)程序(xu)的指(zhi)令。
2. 數據段(.data段) - 存放已初始(shi)化的全局和靜態變量。
3. BSS段(.bss段) - 存放未(wei)初始化的全局(ju)和靜態變量(liang)。
4. 堆區 - 動態分配內存(例如通過malloc)。
5. 棧區 - 存放局部變量和函數參數。
1. 局部變量
定義:局部變量是在函數或(huo)代碼塊(kuai)內(nei)部聲(sheng)明的(de)變量。
存在位置:

· 棧(zhan)區(qu)(Stack):局(ju)部變量存儲在程序的棧(zhan)區(qu)。當(dang)一個函(han)數被調用時(shi),棧(zhan)區(qu)會(hui)(hui)為(wei)該函(han)數的局(ju)部變量分(fen)配內存。當(dang)函(han)數執行結束(shu)后,這部分(fen)內存會(hui)(hui)被自動釋(shi)放(fang)。
特點:
· 作用域:局部變量(liang)只能在其聲明的函數或代碼塊內使用。外(wai)部無法訪問。
· 生命周期:局部變量的生命周期從定(ding)義時開始(shi),到函數結束時結束。
測試程序概念(nian)圖(tu):
2. 全局變量
定義:全局變(bian)量是(shi)在所有函數外部聲明的變(bian)量,可以被程序中任(ren)何函數訪問。
存在位置:
· 數據區(Data Segment):全(quan)局變量存(cun)儲在(zai)程序(xu)的靜態數據區(也稱為數據段)。這個區域在(zai)程序(xu)啟(qi)動時分配內存(cun),并在(zai)整個程序(xu)運行(xing)期間(jian)保(bao)持有效。
特點:
· 作用域:全局變(bian)量可以(yi)在任何(he)函數內(nei)訪問,任何(he)地方都(dou)可以(yi)使用。
· 生(sheng)命周期:全(quan)局變量的生(sheng)命周期與整(zheng)個程(cheng)序(xu)的運(yun)行(xing)時間相同,直(zhi)到(dao)程(cheng)序(xu)結(jie)束。
測試程(cheng)序概念圖:

3. 動態申請的數據
定義:動(dong)態申(shen)請(qing)的數(shu)據是指(zhi)在程序(xu)運(yun)行時,根據需要動(dong)態分(fen)配內(nei)存的一種變量(liang),通常(chang)通過如 malloc、calloc 或(huo) new 等函數(shu)申(shen)請(qing)。
存在位置:
· 堆區(Heap):動(dong)態申請的數據存儲在(zai)堆區。堆區的內存分(fen)配(pei)和釋放由程序員手(shou)動(dong)管(guan)理。
特點:
· 作(zuo)用域:動態分(fen)配的內存可以(yi)在多個函(han)數之間共享,直到顯式釋放。
· 生(sheng)命(ming)周期:生(sheng)命(ming)周期由程序員控制,內存(cun)不(bu)再需要時(shi)需要手(shou)動釋放(使用 free 或(huo) delete)以避免(mian)內存(cun)泄漏。
測試(shi)程(cheng)序概念圖:

代碼測試:


結果:

查看內存映射:

內存映射解釋:
第一行(xing) 555ce2a81000-555ce2a82000 r-xp:
這個段(duan)通常是 .text 段(duan),表示程(cheng)序的代碼部分。
權(quan)限 r-xp 表明它可讀且可執(zhi)行,這(zhe)符合(he)代碼段的特性。
第二行(xing) 555ce2c81000-555ce2c82000 r--p:
這(zhe)里(li)的權限為 r--p,表明這(zhe)個段是可(ke)讀的,不可(ke)執行(xing),只讀段
第(di)三行 555ce2c82000-555ce2c83000 rw-p:
權限 rw-p 表示(shi)可讀可寫,因此這(zhe)個段(duan)通常是 .bss段(duan),用(yong)(yong)于存放未初(chu)始(shi)化的全局和靜態變量,或者是.data 段(duan),用(yong)(yong)來存放 已(yi)初(chu)始(shi)化的全局和靜態變量。
第四行555ce460d000-555ce462e000 rw-p:
權限rw-p 表(biao)示可(ke)(ke)讀(du)可(ke)(ke)寫,這塊有說明是(shi)heap堆區,由程序員進行分配回收(shou)
第(di)十五行(xing) 7ffd6b3a6000-7ffd6b3c7000 rw-p:
權(quan)限rw-p 表示(shi)可讀可寫,這塊(kuai)有(you)說明是棧區
總結
由測試代碼可知(zhi)雖然topo在(zai)func函數結束后(hou)在(zai)main程序還能打(da)印,那是因為雖然釋放topo空(kong)間,但是這塊空(kong)間并(bing)沒有被占用(yong),所以程序并(bing)沒有出錯。
所以我們根據測試記錄可得(de)出(chu)以下(xia)結論。
這些變(bian)量(liang)的存儲位置和管理方式是(shi)理解計算機程(cheng)序運行機制的基礎:
· 局(ju)部變量在(zai)棧(zhan)中,具有局(ju)部作用(yong)域;
· 全局(ju)變量在數據(ju)區(qu),具有全局(ju)作用(yong)域;
· 動態(tai)申請(qing)的數(shu)據在堆中,生命(ming)周期靈活,但需(xu)要手動管理

