C程式儲存空間分布 c知識回顧第三天

2021-07-14 21:55:17 字數 2052 閱讀 2784

程式一直由下列部分組成:

(1)正文段——cpu執行的機器指令部分;乙個程式只有乙個副本;唯讀,防止程式由於意外事故而修改自身指令;

(2)初始化資料段(資料段)——在程式中所有賦了初值的全域性變數,存放在這裡。

(3)非初始化資料段(bss段)——在程式中沒有初始化的全域性變數;核心將此段初始化為0。

(4)棧——增長方向:自頂向下增長;自動變數以及每次函式呼叫時所需要儲存的資訊(返回位址;環境資訊)。

(5)堆——動態儲存分配。

int a = 0;// 全域性初始化區 

char *p1; //全域性未初始化區

main()

**幾種網上的理解**
一:

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放。

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放。

5、程式**區—存放函式體的二進位制**。

二:1、棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

2、堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

3、自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

4、全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。

5、常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改。

三:1、bss是英文block started by symbol的簡稱,通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,在程式載入時由核心清0。bss段屬於靜態記憶體分配。它的初始值也是由使用者自己定義的連線定位檔案所確定,使用者應該將它定義在可讀寫的ram區內,源程式中使用malloc分配的記憶體就是這一塊,它不是根據data大小確定,主要由程式中同時分配記憶體最大值所確定,不過如果超出了範圍,也就是分配失敗,可以等空間釋放之後再分配。

2、text段是程式**段,在at91庫中是表示程式段的大小,它是由編譯器在編譯連線時自動計算的,當你在鏈結定位檔案中將該符號放置在**段後,那麼該符號表示的值就是**段大小,編譯連線時,該符號所代表的值會自動代入到源程式中。

3、data包含靜態初始化的資料,所以有初值的全域性變數和static變數在data區。段的起始位置也是由連線定位檔案所確定,大小在編譯連線時自動分配,它和你的程式大小沒有關係,但和程式使用到的全域性變數,常量數量相關。

4、stack儲存函式的區域性變數和引數。是一種「後進先出」(last in first out,lifo)的資料結構,這意味著最後放到棧上的資料,將會是第乙個從棧上移走的資料。對於哪些暫時存貯的資訊,和不需要長時間儲存的資訊來說,lifo這種資料結構非常理想。在呼叫函式或過程後,系統通常會清除棧上儲存的區域性變數、函式呼叫資訊及其它的資訊。棧另外乙個重要的特徵是,它的位址空間「向下減少」,即當棧上儲存的資料越多,棧的位址就越低。棧(stack)的頂部在可讀寫的ram區的最後。

5、heap儲存函式內部動態分配記憶體,是另外一種用來儲存程式資訊的資料結構,更準確的說是儲存程式的動態變數。堆是「先進先出」(first in first out,fifo)資料結構。它只允許在堆的一端插入資料,在另一端移走資料。堆的位址空間「向上增加」,即當堆上儲存的資料越多,堆的位址就越高。

C 知識回顧(二) 命名空間

隨著工程的增大,名稱相互衝突的肯能性增加,使用多個廠商的類庫時,可能導致名稱衝突。為了解決這些問題,需要用到命名空間。為了將 加入命名空間,可以使用namespae將其包含,例如,編寫一段 其中包含乙個名為myfunction 的函式 1 namespace myspace 2 命名空間可以是全域性...

c 知識回顧

靜下心來回顧學過的知識,隨腦中思考到的書寫。相對c語言更多了引用 指標的更多使用,增加類的實現物件,類的建構函式和析構函式,類的繼承等等。需要理解類繼承過程中物件的建構函式和析構函式的執行順序,虛函式的作用,友元函式等。當然還有非同步 vector map等,這些掌握不深,先不提。類和物件 類是乙個...

c程式儲存空間布局

摘自 c程式一直由下面幾部分組成 1 棧 由編譯器自動分配釋放管理。區域性變數及每次函式呼叫時返回位址 以及呼叫者的環境資訊 例如某些機器暫存器 都存放在棧中。新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,c函式可以遞迴 呼叫。遞迴函式每次呼叫自身時,就使用乙個新的棧幀,...