天氣愈來愈冷啦,你們必定要注意防寒保暖哦~程序員
那麼回到正題,雖然天氣建議咱們待在被窩,可是咱們但是要成爲(程序員)的男人!怎麼能在這關鍵的階段不學習呢?因此今天,咱們仍是繼續來分享咱們的C語言知識——內存佈局。shell
C程序的典型內存表示包括如下部分。編程
1.文本段微信
2.初始化數據段架構
3.未初始化數據段框架
4.堆棧編輯器
5.堆函數
正在運行的進程的典型內存佈局佈局
1.文本段:學習
文本段,也稱爲代碼段或簡稱爲文本,是目標文件或內存中程序的一部分,其中包含可執行指令。
做爲內存區域,能夠在堆或堆棧下方放置一個文本段,以防止堆和堆棧溢出覆蓋它。
一般,文本段是可共享的,所以對於頻繁執行的程序(例如文本編輯器,C編譯器,shell等),僅一個副本須要存儲在內存中。另外,文本段一般是隻讀的,以防止程序意外修改其指令。
2.初始化數據段:
初始化數據段,一般簡稱爲數據段。數據段是程序的虛擬地址空間的一部分,其中包含由程序員初始化的全局變量和靜態變量。
請注意,數據段不是隻讀的,由於能夠在運行時更改變量的值。
該段能夠進一步分爲初始化的只讀區域和初始化的讀寫區域。
例如,在C中由char s [] =「 hello world」定義的全局字符串以及在主(即全局)外部的int debug = 1之類的C語句將存儲在初始化的讀寫區域中。像const char * string =「 hello world」這樣的全局C語句使字符串文字「 hello world」存儲在初始化的只讀區域中,而字符指針變量字符串存儲在初始化的讀寫區域中。
例如:靜態int i = 10將存儲在數據段中,而全局int i = 10也將存儲在數據段中
3.未初始化的數據段:
未初始化的數據段,一般稱爲「 bss」段,以古老的彙編運算符命名,其表明「以符號開頭的塊」。在程序開始執行以前,內核將該段中的數據初始化爲算術0。
未初始化的數據從數據段的末尾開始,包含全部初始化爲零或在源代碼中沒有顯式初始化的全局變量和靜態變量。
例如,一個聲明爲static int i的變量;將包含在BSS段中。
例如,一個聲明爲int j的全局變量;將包含在BSS細分中。
4.堆棧:
堆棧區域傳統上與堆區域相鄰,而且朝相反的方向生長。當堆棧指針遇到堆指針時,可用內存就用完了。(藉助現代的大型地址空間和虛擬內存技術,它們幾乎能夠放置在任何地方,但它們一般仍會朝相反的方向生長。)
堆棧區域包含程序堆棧(一種LIFO結構),一般位於內存的較高部分。在標準PC x86計算機體系結構上,它向地址零增加;在其餘一些架構上,它的發展方向相反。「堆棧指針」寄存器跟蹤堆棧的頂部。每次將值「推入」堆棧時都會對其進行調整。爲一個函數調用推入的一組值稱爲「堆棧幀」;堆棧幀至少包含一個返回地址。
堆棧,用於存儲自動變量,以及每次調用函數時保存的信息。每次調用一個函數時,將返回的地址和有關調用者環境的某些信息(例如某些機器寄存器)都保存在堆棧中。而後,新調用的函數在堆棧上爲其自動和臨時變量分配空間。這就是C中的遞歸函數如何工做的方式。每次遞歸函數調用自身時,都會使用一個新的堆棧框架,所以一組變量不會干擾該函數另外一個實例的變量。
5.堆:
堆是一般進行動態內存分配的段。
堆區域從BSS段的末尾開始,並從那裏擴展到更大的地址。堆區域由malloc,realloc和free管理,它們可使用brk和sbrk系統調用來調整其大小(請注意使用不須要brk / sbrk和單個「堆區」來知足malloc / realloc / free的約定;它們也可使用mmap來實現,以將虛擬內存的潛在不連續區域保留到進程的虛擬地址空間中) 。堆區域由進程中的全部共享庫和動態加載的模塊共享。
以上就是今天學習的內容,但願對你們有幫助哦~
另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這裏或許能夠幫到你~
C語言C++編程學習交流圈子,QQ羣1090842465【點擊進入】微信公衆號:C語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍分享:
編程學習視頻分享: