C/C++編程筆記:C語言內(nèi)存布局精講!零基礎(chǔ)搞懂內(nèi)存管理知識

天氣越來越冷啦,大家一定要注意防寒保暖哦~
那么回到正題,雖然天氣建議我們待在被窩,但是我們可是要成為(程序員)的男人!怎么能在這關(guān)鍵的階段不學(xué)習(xí)呢?所以今天,我們還是繼續(xù)來分享我們的C語言知識——內(nèi)存布局。

C程序的典型內(nèi)存表示包括以下部分。
1.文本段
2.初始化數(shù)據(jù)段
3.未初始化數(shù)據(jù)段
4.堆棧
5.堆

正在運行的進程的典型內(nèi)存布局
1.文本段:
文本段,也稱為代碼段或簡稱為文本,是目標文件或內(nèi)存中程序的一部分,其中包含可執(zhí)行指令。
作為內(nèi)存區(qū)域,可以在堆或堆棧下方放置一個文本段,以防止堆和堆棧溢出覆蓋它。
通常,文本段是可共享的,因此對于頻繁執(zhí)行的程序(例如文本編輯器,C編譯器,shell等),僅一個副本需要存儲在內(nèi)存中。另外,文本段通常是只讀的,以防止程序意外修改其指令。

2.初始化數(shù)據(jù)段:
初始化數(shù)據(jù)段,通常簡稱為數(shù)據(jù)段。數(shù)據(jù)段是程序的虛擬地址空間的一部分,其中包含由程序員初始化的全局變量和靜態(tài)變量。
請注意,數(shù)據(jù)段不是只讀的,因為可以在運行時更改變量的值。
該段可以進一步分為初始化的只讀區(qū)域和初始化的讀寫區(qū)域。
例如,在C中由char s [] =“ hello world”定義的全局字符串以及在主(即全局)外部的int debug = 1之類的C語句將存儲在初始化的讀寫區(qū)域中。像const char * string =“ hello world”這樣的全局C語句使字符串文字“ hello world”存儲在初始化的只讀區(qū)域中,而字符指針變量字符串存儲在初始化的讀寫區(qū)域中。
例如:靜態(tài)int i = 10將存儲在數(shù)據(jù)段中,而全局int i = 10也將存儲在數(shù)據(jù)段中
3.未初始化的數(shù)據(jù)段:
未初始化的數(shù)據(jù)段,通常稱為“ bss”段,以古老的匯編運算符命名,其代表“以符號開頭的塊”。在程序開始執(zhí)行之前,內(nèi)核將該段中的數(shù)據(jù)初始化為算術(shù)0。
未初始化的數(shù)據(jù)從數(shù)據(jù)段的末尾開始,包含所有初始化為零或在源代碼中沒有顯式初始化的全局變量和靜態(tài)變量。
例如,一個聲明為static int i的變量;將包含在BSS段中。
例如,一個聲明為int j的全局變量;將包含在BSS細分中。

4.堆棧:
堆棧區(qū)域傳統(tǒng)上與堆區(qū)域相鄰,并且朝相反的方向生長。當堆棧指針遇到堆指針時,可用內(nèi)存就用完了。(借助現(xiàn)代的大型地址空間和虛擬內(nèi)存技術(shù),它們幾乎可以放置在任何地方,但它們通常仍會朝相反的方向生長。)
堆棧區(qū)域包含程序堆棧(一種LIFO結(jié)構(gòu)),通常位于內(nèi)存的較高部分。在標準PC x86計算機體系結(jié)構(gòu)上,它向地址零增長;在其他一些架構(gòu)上,它的發(fā)展方向相反。“堆棧指針”寄存器跟蹤堆棧的頂部。每次將值“推入”堆棧時都會對其進行調(diào)整。為一個函數(shù)調(diào)用推入的一組值稱為“堆棧幀”;堆棧幀至少包含一個返回地址。
堆棧,用于存儲自動變量,以及每次調(diào)用函數(shù)時保存的信息。每次調(diào)用一個函數(shù)時,將返回的地址和有關(guān)調(diào)用者環(huán)境的某些信息(例如某些機器寄存器)都保存在堆棧中。然后,新調(diào)用的函數(shù)在堆棧上為其自動和臨時變量分配空間。這就是C中的遞歸函數(shù)如何工作的方式。每次遞歸函數(shù)調(diào)用自身時,都會使用一個新的堆??蚣?,因此一組變量不會干擾該函數(shù)另一個實例的變量。

5.堆:
堆是通常進行動態(tài)內(nèi)存分配的段。
堆區(qū)域從BSS段的末尾開始,并從那里擴展到更大的地址。堆區(qū)域由malloc,realloc和free管理,它們可以使用brk和sbrk系統(tǒng)調(diào)用來調(diào)整其大?。ㄕ堊⒁馐褂貌恍枰猙rk / sbrk和單個“堆區(qū)”來滿足malloc / realloc / free的約定;它們也可以使用mmap來實現(xiàn),以將虛擬內(nèi)存的潛在不連續(xù)區(qū)域保留到進程的虛擬地址空間中) 。堆區(qū)域由進程中的所有共享庫和動態(tài)加載的模塊共享。
以上就是今天學(xué)習(xí)的內(nèi)容,希望對大家有幫助哦~
另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍分享:

編程學(xué)習(xí)視頻分享:
