一起talk C栗子吧(第一百三十一回:C語言執行個體--C程式記憶體布局三)

來源:互聯網
上載者:User

標籤:區分   虛擬   ring   func   類型   line   word   使用   log   

各位看官們,大家好。上一回中咱們說的是C程式記憶體布局的範例,這一回咱們繼續說該範例。閑話休提,言歸正轉。讓我們一起talk C栗子吧。

看官們,關於C程式記憶體布局的範例,我們在前面的兩個章回都介紹過了,這一回我們將對前面章回中的內容進行總結和提示。

記憶體布局總結

C程式的記憶體布局主要有四個分區:代碼區,資料區(data和bss)。堆區和棧區。能夠使用readelf -S filename查看各個分區的記憶體位址。這四個分區在記憶體中從低地址空間開始依次向高地址延伸。我們再次使用前面章回中的圖直觀地展示給大家,而且對這些分區做一個全面的總結。

  • 代碼區:主要存放程式的代碼。位於記憶體的低地址空間中。
  • 資料區:它的地址空間位於代碼區上面。主要存放程式中的變數,只是函數中的局部非靜態變數不在該地區中,而是在棧區中。關於變數的類型不同。存放的地區也不同,更加具體的劃分。請參考以下data和bss相關的資訊。
  • data:主要存放程式中初始化的全域變數和局部靜態變數。

    當中全域變數不用區分靜態和非靜態。僅僅要是全域變數都在該地區中。

  • bss:主要存放程式中未初始化的全域變數和局部靜態變數。

    當中全域變數不用區分靜態和非靜態,僅僅要是全域變數都在該地區中。

  • 堆區:位於資料區上面。堆區的大小不固定,它主要存放程式中動態分配的記憶體。該地區的分配和回收由程式猿自己控制。因此也easy出問題。
  • 棧區:位於堆區上面,棧區的大小也不固定。它主要存放函數中的局部非靜態變數和函數調用相關的資訊。該地區由系統進行管理,程式猿不能控制。

總結完分區的內容後。我們結合前面章回中的範例,總結一下範例中各個變數在記憶體中的分布資訊,大家從中能夠看到,範例中各個變數在記憶體中的分布和我們上面總結的內容全然一致。

記憶體分區                分區起始地址       分區中存放的變數和代碼棧區:                  0xbfde3000   存放函數和局部變數:la1,la2,i堆區:                  0x0964d000   存放動態分配的記憶體空間:p所指向的空間.資料區中的bss區:        0x0804a038   存放程式中未初始化的全域變數和局部靜態變數:ga1,static_la1資料區中data區:         0x0804a028   存放程式中初始化的全域變數和局部靜態變數:ga2,static_la2代碼區:                0x080483e0    存放程式的代碼
記憶體布局細節

除了總結外,我們另一些小的細節須要共用給大家。

希望引起大家的注意:

  • 1.在記憶體布局圖中堆區和棧區的分界處各有一條綠線。它表示堆區和棧區的大小是在變化的,它們不像代碼區和資料區一樣擁有固定的大小。
  • 2.堆區的記憶體空間是從低地址向高地址延伸,而棧區的記憶體空間是從高地址向低地址延伸。雖然它們都是大小能夠變化的分區。可是在分區變化的方向上正好相反。
  • 3.程式中代碼區和資料區的地址空間是固定的。不會隨著程式執行而發生變化。

    可是程式中堆區和棧區的地址空間是動態變化的。已經有細心的看官發現了,我們在上一回中的範例,執行過兩次。位於資料區中的變數地址在兩次執行結果中全然一致,可是位於堆區和棧區中的變數地址在兩次執行結果中不同樣。

    這便是最好的證明。

記憶體布局之外

看官們,俗話說的好,當局者迷。旁觀者清。在大家細緻觀察記憶體中的各個分區時。讓我們跳出這些分區之外,從整個記憶體的角度來做一些說明,希望能把大家就“迷局”中拉出來 。

  • 1.我們在這些章回中說的地址都是指虛擬記憶體地址,這點在一百二十九回介紹過。

  • 2.記憶體的布局除了我們介紹的這四個分區外,還有其他的分區。僅僅是這四個分區與代碼的關係更加密切一些。
  • 3.使用readelf工具能夠查看可執行檔裡的分區資訊,只是這裡僅僅使用了該命令的S選項,其他的選項沒有介紹,大家能夠自己摸索一下。
  • 4.通過/proc虛擬資料夾中的檔案來查看記憶體相關的資訊。主要有cmdline,maps,status。

    readelf查看的是程式已經固定的靜態資訊,像堆,棧這些動態資訊,就須要查看proc檔案夾中的檔案了,該檔案夾中的檔案提供了程式執行時的即時資訊。

各位看官。關於C程式記憶體布局的範例咱們就講到這裡。欲知後面還有什麼範例,且聽下回分解 。

一起talk C栗子吧(第一百三十一回:C語言執行個體--C程式記憶體布局三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.