C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)
1.linux下C程序?yàn)閮?nèi)存分配空間
(1)代碼段
對(duì)應(yīng)著程序中的代碼(函數(shù)),代碼段在linux中又叫文本段(.text)
?(2)數(shù)據(jù)段、bss段
數(shù)據(jù)段存:顯式初始化為非0的全局變量,顯式初始化為非0的static局部變量
bss段存:顯式初始化為0或者未顯式初始化的全局變量,顯式初始化為0或未顯式初始化的static局部變量。
?(3)堆
C語(yǔ)言中什么樣變量存在堆內(nèi)存中?C語(yǔ)言不會(huì)自動(dòng)向堆中存放東西,堆的操作是程序員自己手工操作的。程序員根據(jù)需求自己判斷要不要使用堆內(nèi)存,用的時(shí)候自己申請(qǐng),自己使用,完了自己釋放。
(4)文件映射區(qū)
文件映射區(qū)就是進(jìn)程打開(kāi)了文件后,將這個(gè)文件的內(nèi)容從硬盤(pán)讀到進(jìn)程的文件映射區(qū),以后就直接在內(nèi)存中操作這個(gè)文件,讀寫(xiě)完了后在保存時(shí)再將內(nèi)存中的文件寫(xiě)到硬盤(pán)中去
(4)棧
棧內(nèi)存區(qū),局部變量分配在棧上;函數(shù)調(diào)用傳參過(guò)程也會(huì)用到棧,遞歸函數(shù)運(yùn)行也在棧上
(5)內(nèi)核映射區(qū)
內(nèi)核映射區(qū)就是將操作系統(tǒng)內(nèi)核程序映射到這個(gè)區(qū)域了。
對(duì)于linux中的每一個(gè)進(jìn)程來(lái)說(shuō),它都以為整個(gè)系統(tǒng)中只有它自己和內(nèi)核而已。它認(rèn)為內(nèi)存地址0xC0000000以下都是它自己的活動(dòng)空間,0xC0000000以上是OS內(nèi)核的活動(dòng)空間。
每一個(gè)進(jìn)程都活在自己獨(dú)立的進(jìn)程空間中,0-3G的空間每一個(gè)進(jìn)程是不同的(因?yàn)橛昧颂摂M地址技術(shù)),但是內(nèi)核是唯一的。
?
2.代碼段、數(shù)據(jù)段、bss段
(1)編譯器在編譯程序的時(shí)候,將程序中的所有的元素分成了一些組成部分,各部分構(gòu)成一個(gè)段,所以說(shuō)段是可執(zhí)行程序的組成部分。
(2)代碼段:代碼段就是程序中的可執(zhí)行部分,直觀理解代碼段就是函數(shù)堆疊組成的。
(3)數(shù)據(jù)段(.data段也被稱為數(shù)據(jù)區(qū)、靜態(tài)數(shù)據(jù)區(qū)、靜態(tài)區(qū)):數(shù)據(jù)段就是程序中的數(shù)據(jù),直觀理解就是C語(yǔ)言程序中的全局變量。(注意:全局變量才算是程序的數(shù)據(jù),局部變量不算程序的數(shù)據(jù),只能算是函數(shù)的數(shù)據(jù))
(4)bss段(又叫ZI(zero initial)段):bss段的特點(diǎn)就是被初始化為0,bss段本質(zhì)上也是屬于數(shù)據(jù)段,bss段就是被初始化為0的數(shù)據(jù)段。
注意區(qū)分:數(shù)據(jù)段(.data)和bss段的區(qū)別和聯(lián)系:
- 二者本來(lái)沒(méi)有本質(zhì)區(qū)別,都是用來(lái)存放C程序中的全局變量的。
- 區(qū)別在于把顯示初始化為非零的全局變量存在.data段中,而把顯式初始化為0或者并未顯式初始化(C語(yǔ)言規(guī)定未顯式初始化的全局變量值默認(rèn)為0)的全局變量存在bss段。
有些特殊數(shù)據(jù)會(huì)被放到代碼段
- C語(yǔ)言中使用char *p = “l(fā)inux”;定義字符串時(shí),字符串"linux"實(shí)際被分配在代碼段,也就是說(shuō)這個(gè)"linux"字符串實(shí)際上是一個(gè)常量字符串而不是變量字符串。
const的實(shí)現(xiàn)方法至少有2種:
第一種就是編譯將const修飾的變量放在代碼段去以實(shí)現(xiàn)不能修改(普遍見(jiàn)于各種單片機(jī)的編譯器);
第二種就是由編譯器來(lái)檢查以確保const型的常量不會(huì)被修改,實(shí)際上const型的常量還是和普通變量一樣放在數(shù)據(jù)段的(gcc中就是這樣實(shí)現(xiàn)的)。
3.變量的生命周期
(1)棧變量的生命周期
局部變量(棧變量)存儲(chǔ)在棧上,生命周期是臨時(shí)的。臨時(shí)的意思就是說(shuō):代碼執(zhí)行過(guò)程中按照需要去創(chuàng)建、使用、消亡的。
譬如一個(gè)函數(shù)內(nèi)定義的局部變量,在這個(gè)函數(shù)每一次被調(diào)用時(shí)都會(huì)創(chuàng)建一次,然后使用,最后在函數(shù)返回的時(shí)候消亡。
(2)堆變量的生命周期
程序使用堆內(nèi)存的這一段時(shí)間,因此堆變量也有了自己的生命周期,就是:從malloc申請(qǐng)時(shí)誕生,然后使用,直到free時(shí)消亡。
(3)數(shù)據(jù)段、bss段變量的生命周期
全局變量的生命周期是在程序被執(zhí)行時(shí)誕生,在程序終止時(shí)消亡。
全局變量所占用的內(nèi)存是不能被程序自己釋放的,所以程序如果申請(qǐng)了過(guò)多的全局變量會(huì)導(dǎo)致這個(gè)程序一直占用大量?jī)?nèi)存。
(4)代碼段、只讀段的生命周期
其實(shí)就是程序執(zhí)行的代碼,其實(shí)就是函數(shù),它的生命周期是永久的。
有時(shí)候放在代碼段的不只是代碼,還有const類型的常量,還有字符串常量。(const類型的常量、字符串常量有時(shí)候放在rodata段,有時(shí)候放在代碼段,取決于平臺(tái))
?
總結(jié)
以上是生活随笔為你收集整理的C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux线程的终止
- 下一篇: KITTI数据集下载以及处理