c語言作為一門應用廣泛、功能強大、使用靈活的面向過程的程式語言。所以在記憶體管理方面能夠加深我們對程式的理解。有助於開發高效的應用。
記憶體的組成
對於乙個由c語言編寫的程式而言,記憶體主要可以分為以下5個組成部分:
注意:
**段、資料段、bss段程式編譯期間由編譯器分配記憶體空間,在程式啟動載入時,由於未初始化的全域性變數存放在bss段,已初始化的全域性變數存放在資料段,所以程式中因應該盡量少使用全域性變數。以節省程式的編譯和啟動時間。
變數的記憶體分配
棧(stack)
首先棧應該是資料結構中的一種線性結構被介紹,其具有先進後出特性(簡稱filo)。
棧區類似於手槍中的彈夾,最先放進去的子彈,最後才被彈出,最後放進入的子彈最先彈出。其次棧作為記憶體中儲存結構,通常存放程式臨時建立的區域性變數。
下面給出如何實現乙個棧:
#include
#define stack_size 64
//棧大小
#define top_of_stack -1
//棧頂位置
intstack_push
(char
* stack,
int top,
int value)
;int
stack_pop
(char
* stack,
int top)
;int
stack_is_empty
(int top)
;int
stack_is_full
(int top)
;//入棧
intstack_push
(char
* stack,
int top,
int value)
stack[
++top]
=value;
printf
("入棧元素:%d\n"
,stack[top]);
return top;
}//出棧
intstack_pop
(char
* stack,
int top)
printf
("出棧元素:%d\n"
,stack[top]);
top--
;return top;
}int
stack_is_empty
(int top)
intstack_is_full
(int top)
intmain
(int argc,
char
**ar**)
如果想更深入的理解資料結構中的棧,可以參考棧的實現
棧頂的位址和棧的最大容量一般是由系統預先規定好的,通常不會太大。由於棧中主要存放是區域性變數,而區域性變數的占用記憶體空間是其所在的**段或函式段結束時由系統**重新利用。所以棧的空間是迴圈利用自動管理的,一般不需要人為操作。
注意:
不宜在棧中申請過大的空間,比如長度很大的陣列,遞迴呼叫重複次數很多的函式等等。
堆(heap)
通常存放程式執行中動態分配的儲存空間。堆是低位址向高位址擴充套件的資料結構,是一塊不連續的記憶體區域。在標準c語言上,使用malloc等記憶體分配函式是從堆中分配記憶體的,在objective-c中,使用new建立的物件也是從堆中分配記憶體的。
動態分配記憶體空間例子:
#include
#include
//malloc,free,rand
intmain
(int argc,
char
const
*ar**)
//隨機生成字串
for( i =
0; i < input; i++
) buf[i]
='\0'
;printf
("a randomly generated string: %s\n"
,buf)
;free
(buf)
;return0;
}
輸出結果:
堆記憶體是作業系統劃分給堆管理器來管理的,管理器向使用者(使用者程序)提供api(malloc和free等)來使用堆記憶體。需要程式設計師手動分配釋放,如果程式設計師在使用完申請後的堆記憶體卻沒有及時把它釋放掉,那麼這塊記憶體就丟失了,這就是所謂的–記憶體洩漏
bss段
block started by symbol的簡稱,通常是指用來存放程式中未初始化的全域性變數和靜態變數。
資料段
通常是指用來存放程式中已初始化的全域性變數和靜態變數以及字串常量。
**段
通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定。
C語言記憶體分配
c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...
C語言記憶體分配
c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...
C語言記憶體分配
objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...