當(dāng)前位置:首頁(yè) > 學(xué)習(xí)資源 > 講師博文 > C語(yǔ)言-變量存儲(chǔ)方式
程序段的內(nèi)存布局
在C程序中,內(nèi)存通常分為幾個(gè)主要區(qū)域:
1. 代碼段(.text段) - 存放程序的指令。
2. 數(shù)據(jù)段(.data段) - 存放已初始化的全局和靜態(tài)變量。
3. BSS段(.bss段) - 存放未初始化的全局和靜態(tài)變量。
4. 堆區(qū) - 動(dòng)態(tài)分配內(nèi)存(例如通過(guò)malloc)。
5. 棧區(qū) - 存放局部變量和函數(shù)參數(shù)。
1. 局部變量
定義:局部變量是在函數(shù)或代碼塊內(nèi)部聲明的變量。
存在位置:
· 棧區(qū)(Stack):局部變量存儲(chǔ)在程序的棧區(qū)。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),棧區(qū)會(huì)為該函數(shù)的局部變量分配內(nèi)存。當(dāng)函數(shù)執(zhí)行結(jié)束后,這部分內(nèi)存會(huì)被自動(dòng)釋放。
特點(diǎn):
· 作用域:局部變量只能在其聲明的函數(shù)或代碼塊內(nèi)使用。外部無(wú)法訪問(wèn)。
· 生命周期:局部變量的生命周期從定義時(shí)開(kāi)始,到函數(shù)結(jié)束時(shí)結(jié)束。
測(cè)試程序概念圖:
2. 全局變量
定義:全局變量是在所有函數(shù)外部聲明的變量,可以被程序中任何函數(shù)訪問(wèn)。
存在位置:
· 數(shù)據(jù)區(qū)(Data Segment):全局變量存儲(chǔ)在程序的靜態(tài)數(shù)據(jù)區(qū)(也稱為數(shù)據(jù)段)。這個(gè)區(qū)域在程序啟動(dòng)時(shí)分配內(nèi)存,并在整個(gè)程序運(yùn)行期間保持有效。
特點(diǎn):
· 作用域:全局變量可以在任何函數(shù)內(nèi)訪問(wèn),任何地方都可以使用。
· 生命周期:全局變量的生命周期與整個(gè)程序的運(yùn)行時(shí)間相同,直到程序結(jié)束。
測(cè)試程序概念圖:
3. 動(dòng)態(tài)申請(qǐng)的數(shù)據(jù)
定義:動(dòng)態(tài)申請(qǐng)的數(shù)據(jù)是指在程序運(yùn)行時(shí),根據(jù)需要?jiǎng)討B(tài)分配內(nèi)存的一種變量,通常通過(guò)如 malloc、calloc 或 new 等函數(shù)申請(qǐng)。
存在位置:
· 堆區(qū)(Heap):動(dòng)態(tài)申請(qǐng)的數(shù)據(jù)存儲(chǔ)在堆區(qū)。堆區(qū)的內(nèi)存分配和釋放由程序員手動(dòng)管理。
特點(diǎn):
· 作用域:動(dòng)態(tài)分配的內(nèi)存可以在多個(gè)函數(shù)之間共享,直到顯式釋放。
· 生命周期:生命周期由程序員控制,內(nèi)存不再需要時(shí)需要手動(dòng)釋放(使用 free 或 delete)以避免內(nèi)存泄漏。
測(cè)試程序概念圖:
代碼測(cè)試:
結(jié)果:
查看內(nèi)存映射:
內(nèi)存映射解釋:
第一行 555ce2a81000-555ce2a82000 r-xp:
這個(gè)段通常是 .text 段,表示程序的代碼部分。
權(quán)限 r-xp 表明它可讀且可執(zhí)行,這符合代碼段的特性。
第二行 555ce2c81000-555ce2c82000 r--p:
這里的權(quán)限為 r--p,表明這個(gè)段是可讀的,不可執(zhí)行,只讀段
第三行 555ce2c82000-555ce2c83000 rw-p:
權(quán)限 rw-p 表示可讀可寫(xiě),因此這個(gè)段通常是 .bss段,用于存放未初始化的全局和靜態(tài)變量,或者是.data 段,用來(lái)存放 已初始化的全局和靜態(tài)變量。
第四行555ce460d000-555ce462e000 rw-p:
權(quán)限r(nóng)w-p 表示可讀可寫(xiě),這塊有說(shuō)明是heap堆區(qū),由程序員進(jìn)行分配回收
第十五行 7ffd6b3a6000-7ffd6b3c7000 rw-p:
權(quán)限r(nóng)w-p 表示可讀可寫(xiě),這塊有說(shuō)明是棧區(qū)
總結(jié)
由測(cè)試代碼可知雖然topo在func函數(shù)結(jié)束后在main程序還能打印,那是因?yàn)殡m然釋放topo空間,但是這塊空間并沒(méi)有被占用,所以程序并沒(méi)有出錯(cuò)。
所以我們根據(jù)測(cè)試記錄可得出以下結(jié)論。
這些變量的存儲(chǔ)位置和管理方式是理解計(jì)算機(jī)程序運(yùn)行機(jī)制的基礎(chǔ):
· 局部變量在棧中,具有局部作用域;
· 全局變量在數(shù)據(jù)區(qū),具有全局作用域;
· 動(dòng)態(tài)申請(qǐng)的數(shù)據(jù)在堆中,生命周期靈活,但需要手動(dòng)管理