日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解好内存管理,C语言就不难学了

發布時間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解好内存管理,C语言就不难学了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方藍字關注我,了解更多咨詢

任何程序運行起來都需要分配內存空間存放該進程的資源信息的,C程序也不例外。C程序中的變量、常量、函數、代碼等等的信息所存放的區域都有所不同,不同的區域又有不同的特性。C語言學習者、尤其是在學習嵌入式的朋友,這些知識點一定要吃透!

被欺騙的C進程

每一個C語言的程序被執行起來的時候系統為了更方便開發人員操作,會給每一個進程分配一個虛擬的內存空間,它實際上是從處理內存映射出來的。虛擬內存的起始地址結束地址都是固定的,因此虛擬內存的布局都是一樣。比如有三個進程 P1 P2 P3 ,他們雖然得到的物理內存是完全不一樣,但是從進程的角度來看他們三個得到的內存確實一模一樣的。

假設你正在使用的計算機實際物理內存只有 1GB 大小,而當前系統運行了三個進程,Linux 會將 PM 中的某些內存映射為三個大小均為 4GB 的虛擬內存?,讓每個進程都以為自己獨自擁有了完整的內存空間,這樣極大地方 便了應用層程序的數據和代碼的組織。

虛擬內存布局:

虛擬內存布局分為內核空間、棧、堆、數據段、代碼段和一個不允許訪問的空間(相當于一堵墻)。

一個用戶進程可以訪問的內存區域介于 0x0804 8000 到0xc0000000 之間,這個“廣袤”的區域又被分成了幾個部分,分別用來存放進程的代碼和數據。

下面讓我們更進一步地研究虛擬內存中每一個空間所存放的是什么類型的數據。

棧內存

棧內存是用于存放環境變量、命令行參數和局部變量的。棧內存空間十分有限,默認情況下棧的大小為 8M ,在嵌入式開發的時候我們應該盡可能減少使用棧空間。棧空間的增長,從上(高地址) 往下 (低地址)每當有一個函數被調用的時候,棧就會從上往下分配一個段,這一段空間就是一個棧幀,該內存空間用來存放該函數的局部變量。

當一個函數退出(調用結束)的時候,棧空間會從下往上釋放一個棧幀,將所有的內存歸還給系統。

注意:

棧空間中的內存存放的數據值是未知的, 因此每一個局部變量在使用之前最好做好初始化

棧內存的空間我們無法手動實現申請與釋放,都是由系統自動完成,我們無法干預。

堆空間

堆空間是相對自由的空間,這是一個非常重要的區域,因為在此區域定義的內存的?生命周期我們是可以控制的:從 malloc( )/calloc( )/realloc( )開始,到 free( )結束,其分配和釋放完全由我們開發者自定義,這就給了我們最大的自由和靈活性,讓程序在運行的過 程當中,以最大的效益使用內存。

注意:

  • 相對于棧空間來說,堆的內存空間相對大很多

  • 堆空間的增長方式,從下(低地址)往上(高地址)

  • 堆空間中的內存都屬于匿名空間, 因此需要借助指針來訪問

  • 有開發者自行申請和釋放的,如果沒有釋放那么這個空間將一直存在,直到程序結束。

數據段

數據段中存放著全局變量、靜態變量、和常量這些數據,生命周期與程序一致。程序不止,數據不斷

代碼段

代碼段中又分成了兩個空間:

.text段:存放用戶的代碼(mian func ...)

init段:當程序運行之初的一些初始化的工作(由編譯器根據系統來對應添加的)

內存管理是嵌入式學習的重點知識,也是判斷一個人是否入門的重要標志。內存管理學得好,對C語言的理解又會更加深刻一些。

END

*聲明:本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。

戳“閱讀原文”我們一起進步

總結

以上是生活随笔為你收集整理的理解好内存管理,C语言就不难学了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。