解析C語言的堆、棧和代碼段、數據…

一、棧的詳解
運行時自動分配&自動回收:棧是自動管理的,程序員不需要手工干預。方便簡單。
反覆使用:棧內存在程序中其實就是那一塊空間,程序反覆使用這一塊空間。
髒內存:棧內存由於反覆使用,每次使用後程序不會去清理,因此分配到時保留原來的值。
臨時性:(函數不能返回棧變量的指針,因爲這個空間是臨時的)
棧會溢出:因爲操作系統事先給定了棧的大小,如果在函數中無窮盡的分配棧內存總能用完。
二、堆內存詳解
操作系統堆管理器管理:堆管理器是操作系統的一個模塊,堆管理內存分配靈活,按需分配。
大塊內存:堆內存管理者總量很大的操作系統內存塊,各進程可以按需申請使用,使用完釋放。
程序手動申請&釋放:手工意思是需要寫代碼去申請malloc和釋放free。
髒內存:堆內存也是反覆使用的,而且使用者用完釋放前不會清除,因此也是髒的。
臨時性:堆內存只在malloc和free之間屬於我這個進程,而可以訪問。在malloc之前和free之後
都不能再訪問,否則會有不可預料的後果。

三、代碼段、數據段、bss段
1.
(1)編譯器在編譯程序的時候,將程序中的所有的元素分成了一些組成部分,各部分構成一個段,所以說段是可執行程序的組成部分。
(2)代碼段:代碼段就是程序中的可執行部分,直觀理解代碼段就是函數堆疊組成的。
(3)數據段(也被稱爲數據區、靜態數據區、靜態區):數據段就是程序中的數據,直觀理解就是C語言程序中的全局變量。(注意:全局變量纔算是程序的數據,局部變量不算程序的數據,只能算是函數的數據)
(4)bss段(又叫ZI(zero initial)段):bss段的特點就是被初始化爲0,bss段本質上也是屬於數據段,bss段就是被初始化爲0的數據段。
注意區分:數據段(.data)和bss段的區別和聯繫:二者本來沒有本質區別,都是用來存放C程序中的全局變量的。區別在於把顯示初始化爲非零的全局變量存在.data段中,而把顯式初始化爲0或者並未顯式初始化(C語言規定未顯式初始化的全局變量值默認爲0)的全局變量存在bss段。

2、有些特殊數據會被放到代碼段
(1)C語言中使用char *p = "linux";定義字符串時,字符串"linux"實際被分配在代碼段,也就是說這個"linux"字符串實際上是一個常量字符串而不是變量字符串。
(2)const型常量:C語言中const關鍵字用來定義常量,常量就是不能被改變的量。const的實現方法至少有2種:第一種就是編譯將const修飾的變量放在代碼段去以實現不能修改(普遍見於各種單片機的編譯器);第二種就是由編譯器來檢查以確保const型的常量不會被修改,實際上const型的常量還是和普通變量一樣放在數據段的(gcc中就是這樣實現的)。

3、顯式初始化爲非零的全局變量和靜態局部變量放在數據段
(1)放在.data段的變量有2種:第一種是顯式初始化爲非零的全局變量。第二種是靜態局部變量,也就是static修飾的局部變量。(普通局部變量分配在棧上,靜態局部變量分配在.data段)

4、未初始化或顯式初始化爲0的全局變量放在bss段
(1)bss段和.data段並沒有本質區別,幾乎可以不用明確去區分這兩種。

總結:C語言中所有變量和常量所使用的內存無非以上三種情況。
(1)相同點:三種獲取內存的方法,都可以給程序提供可用內存,都可以用來定義變量給程序用。
(2)不同點:棧內存對應C中的普通局部變量(別的變量還用不了棧,而且棧是自動的,由編譯器和運行時環境共同來提供服務的,程序員無法手工控制);堆內存完全是獨立於我們的程序存在和管理的,程序需要內存時可以去手工申請malloc,使用完成後必須儘快free釋放。(堆內存對程序就好像公共圖書館對於人);數據段對於程序來說對應C程序中的全局變量和靜態局部變量。
(3)如果我需要一段內存來存儲數據,我究竟應該把這個數據存儲在哪裏?(或者說我要定義一個變量,我究竟應該定義爲局部變量還是全局變量還是用malloc來實現)。不同的存儲方式有不同的特點,簡單總結如下:
* 函數內部臨時使用,除了函數不會用到,就定義局部變量;
* 堆內存和數據段幾乎擁有完全相同的屬性,大部分時候是可以完全替換的。但是生命週期不一樣:
 堆內存的生命週期是從malloc開始到free結束,而全局變量是從整個程序一開始執行就開始,
 直到整個程序結束纔會消滅,伴隨程序運行的一生。
啓示:如果你這個變量只是在程序的一個階段有用,用完就不用了,就適合用堆內存;如果這個變量本身和程序是一生相伴的,那就適合用全局變量。(堆內存就好像租房、數據段就好像買房。堆內存就好像圖書館借書,數
 據段就好像自己去書店買書)你以後會慢慢發現:買不如租,堆內存的使用比全局變量廣泛。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章