C語言探秘:C代碼在內存中的分布

估計會有很多初學者跟我有一樣的疑惑,這些編寫好的代碼是放在磁盤中,但是運行將會被copy至內存中去運行。但他們在內存中是怎么分布呢。在?“linux下c編程圣經”(apue)UNIX環境高級編程一書中闡述了這一點。在這里結合網上資料以及這本書寫下自己的一點學習筆記。

在內存中程序分別存儲在如下幾個區域中:

一、正文區(Code?or?Text)

對于名字有很多,有的稱為代碼段,代碼區等等。但是實質都是一樣的,都是用來存放程序語句進行編譯后,形成機器的代碼。一般此內存區是只讀的,防止程序意外修改指令。

二、初始數據段(RO/RW?data?segment)

通常是用來存放程序中已初始化的全局變量的一塊內存區域。又分為只讀和讀寫兩種,此數據段屬于靜態內存分配

三、未初始化數據段(BSS?=?Block?Started?by?Symbol)

未初始化讀寫據是在程序中聲明,但是沒有初始化的變量,這些變量在程序運行之前不需要占用存儲器的空間.BSS段也屬于靜態內存分配

四、堆(heap)

堆內存只在程序運行時出現,一般由程序員手動分配和釋放,一般可以使用malloc()/nalloc()?&?free()?函數來申請、釋放。在操作系統下,如果程序員沒釋放,一般操作系統可以在程序結束后回收內存

五、棧(stack)

存放程序的局部變量(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此以外,在函數被調用時,棧用來傳遞參數和返回值。由于棧的最大特點進先出,所以棧特別方便用來保存/恢復調用現場。

用圖片來解釋會更加通俗。左圖是書上的。從圖上可以看到,棧(stack)是自頂向下生長的,即由高地址向低地址;堆(heap)是自底向上生長。右圖是棧的進出示意圖,很明顯的后進先出。

? ?

這里比較重要的概念主要是?棧 和 堆。在網上收集了下他們之間的 PK?“數據”

棧? ?


棧內存從高地址向低地址分配


堆內存將從低地址向高地址分配


棧使用
線性存儲的方式


堆使用
鏈表來實現


棧是
連續內存分布的方式


堆是
非連續內存分布方式

棧只有一個入口,就是棧指針,棧指針標識當前棧區域中已經使用與未使用的界限,程序訪問棧內存的時候都只能通過棧指針及其偏移量


????堆內存有多個入口,每次分配得到的指針是訪問內存的入口,每個分配內存都可被單獨釋放



????棧內存在分配的時候,不能在程序中判斷其成功與否,當棧內存的使用量比較大的時候(例如使用函數進行遞歸運算),棧內存可能超出系統的容量,這時程序運行將發生棧溢出錯誤

? ??堆內存在分配的時候,可以在程序中判斷malloc()等函數的返回值是否為NULL來確定對內存是否分配成功,是否可以使用


棧內存由編譯器管理,不需要程序來管理,同時,函數內部的棧內存是不能被函數的調用者使用的


堆內存需要在程序中處理它的分配與釋放情況(由程序調用具體的庫函數管理),可以利用靈活的程序將堆內存的指針從函數的內部傳遞到函數的外部,這時各個函數都可以使用別的函數分配出來的堆內存。


棧的一些特殊定義:

棧限定只能在表的一端進行插入和刪除操作的線性表。允許插入和刪除的一端稱作棧頂(top),不允許插入和刪除端稱作棧底(bottom)
空棧:這里有兩種說法。1.堆棧指針指向下一個將要放入數據的空位置時。
????????????????????? 2.
棧頂指向棧底地址時,即棧內沒有數據時為空棧。
? (
對于上面這兩種定義一直沒有找到權威的出處。網上兩種概念都存在,我也不知道哪種才是正確的,希望有明確此概念的大神提點下。
滿棧:棧指針指向的是一個有可用數據的,也就是最后一個使用的空間。
有圖才有真相,沒圖沒人理.上圖咯。

上面把空棧的兩種定義都畫出來了,可能有一個是有誤的,等我找到權威定義后更新此文,把錯誤的說法列成反面例子,供大家“批斗”!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

集合:按元素的中文屬性排序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 要排序的元素類&#xff1a; public static class NameCount implements Comparable<NameCount> {Collator collator Collato…

kibana 安裝

附另 2 文章&#xff1a; elasticsearch-head 安裝 elasticsearch 安裝( 阿里云ECS )、遠程訪問、啟動報錯處理 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的 elasticsearch 是…

linux jps 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 jps -- Java Virtual Machine Process Status Tool 可以列出本機所有java進程的pid jps [ options ] [ hostid ] 選項 -q 僅輸出…

“4K”時代將來臨!標準/技術一網打盡

第1頁&#xff1a;4K 分辨率與 DCI 數字電影院在今年的 CES&#xff08;電子消費大展&#xff09;上&#xff0c;除了讓人眼花繚亂新手機等移動設備外&#xff0c;還有一個領域讓人感到相當矚目&#xff0c;這就是所謂的 4K 電視產品。 4K 電視的賣點當然是高分辨率&#xff0c…

解決:Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column refere

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.報錯&#xff1a; Error while compiling statement: FAILED: SemanticException [Error 10007]: Ambiguous column reference creat…

解決:which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/…

Image Processing Wavefronts for HEVC Parallelism

Unlike H.264/AVC, where parallelism was an afterthought, the current HEVC draft contains several proposals aiming at making the codec better “parallelizable”. H.264/AVC supports slices, which were introduced mainly to prevent loss of quality in the case …

Hive 刪除整個數據庫,包括其中的所有表

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 drop DATABASE IF EXISTS 數據庫名 CASCADE; 使用CASCADE &#xff0c;表示強制刪除。

Windows 9信息曝光:統一開發接口、整合Cortana到任務欄

摘要&#xff1a;2014年微軟全球合作伙伴大會在美國華盛頓正式拉開序幕&#xff0c;會上&#xff0c;微軟首席運營商Kevin Turner透露了微軟下一代操作系統Windows 9的一些信息&#xff1a;統一開發接口、語音助手Cortana將被整合到任務欄、桌面小工具回歸等。 北京時間7月15日…

解決: Error while compiling statement: FAILED: ParseException line 23:13 extraneous input ‘(‘ expectin

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. hive 執行sql&#xff0c;報錯&#xff1a; Error while compiling statement: FAILED: ParseException line 23:13 extraneous inp…

程序員可以只關心技術么?

摘要&#xff1a;不少程序員愛維護喜歡的技術&#xff0c;雖然他們說的有道理&#xff0c;但程序員價值的實現并不取決于技術。模式不一樣&#xff0c;程序員價值也不一樣&#xff0c;而這也暗含了程序員生涯的兩個進階模式&#xff0c;讀完此文&#xff0c;相信你會重新思考個…

Intellij IDEA中分屏顯示方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 今天才發現IDEA中還有split view的功能&#xff0c;上網查的時候查到了很多莫名其妙的東西。 實際上對想分屏顯示的文件 右鍵->Spli…

IDR、CRA、BLA、RASL、RADL、closed-gop、open-gop

相對于H.264編碼的每個GOP是相互獨立的&#xff0c;GOP切換用I幀&#xff0c;幀間搜索不再參考前一個GOP。而HEVC切換則可以“軟切換”。 BLA、CRA、IDR是文獻中提到過的三種隨機接入點(RAP)&#xff0c;在文獻中的解釋的確不是很容易理解。 &#xff08;1&#xff09;關于GOP…

ROW_NUMBER() OVER() 函數用法詳解 (分組排序,多例子)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 語法格式&#xff1a;row_number() over(partition by 分組列 order by 排序列 desc) row_number() over()分組排序功能&#xff1a; …

解決:您需要來自xxx的權限才能對此文件夾進行更改(電腦系統取得管理員權限)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.莫名的一個項目工程代碼就打不開了。提示信息為&#xff1a; 2. 刪除也不行&#xff0c;更新也不行&#xff0c;火大&#xff0c;我惹…

程序員父親的遺產——編程十誡

我的父親在和我徹談編程兩個星期之后就去世了。 那個時候我22歲&#xff0c;一個剛剛完成美學學士畢業設計的大四學生。而我的父親62歲&#xff0c;比大多數我同齡人的父親都要老。早在60年代&#xff0c;他就已經在田納西理工大學開始編程了&#xff0c;那個時候他在穿孔卡片…

解決:Can not deserialize instance of com.xxx.xx.XXModel out of START_ARRAY toke

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. json數據解析報錯&#xff1a; Can not deserialize instance of com.xxx.xxx.model.XXXModel out of START_ARRAY token 2. 需要一…

HEVC標準概覽

HEVC標準概覽HEVC&#xff08;高效視頻編碼標準&#xff09;是ITU-T VCEG&#xff08;國際電聯電信標準化部視頻編碼組&#xff09;與ISO/IEC MPEG&#xff08;國際標準化組織國際電工委員會視頻標準化組&#xff09;的合作組織JCT-VC最新項目。ITU-T和ISO/IEC計劃在2013年1月共…

解決:Unable to identify index name. XXXModel is not a Document. Make sure the document class is annota

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 往 elasticsearch 寫入數據調用 index 方法&#xff0c;執行報錯&#xff1a; Unable to identify index name. XXXModel is not a …

為什么年事已高的我還在編程?

每一個行業的從業人員都會有變老的那一刻&#xff0c;難道變老了之后還要繼續從事之前的工作嗎&#xff1f;估計沒人愿意&#xff0c;除非是體力上吃得消的。接下來所講述的就是作為程序員的碼農們該如何迎接慢慢變老之后的工作轉變&#xff01;人們都會期望隨著歲數的增加&…