1. 程式人生 > 其它 >C的記憶體管理

C的記憶體管理

1靜態記憶體、動態記憶體
靜態記憶體分配好後,程式執行過程中一直存在不會被釋放,且一旦分配好,其記憶體大小就固定下來不能改變,在編譯和連結的階段就會分配好。
動態記憶體是程式執行過程中,根據程式的需要分配和釋放,其大小可變。

2 堆與棧
堆是程式通過呼叫malloc或new分配,呼叫free或delete釋放。 棧是線性結構,堆是連結串列結構。

3 C的記憶體分配
全域性變數和static修飾的靜態變數都存放在靜態記憶體區
函式內部定義的區域性變數,儲存在棧上,函式退出時,其佔用記憶體被收回。
呼叫malloc或new得到的記憶體在堆上,不再需要時要顯示的呼叫free或delete來釋放,否則會造成記憶體洩漏

簡易示例
//main.cpp
int a = 0; //全域性初始化區,靜態記憶體
char *p1; //全域性未初始化區,靜態記憶體
main()
{
int b; //棧
char s[] = "abc"; //棧
char *p2; // 棧
char *p3 = "123456"; //"123456\0"在常量區,靜態記憶體,p3在棧上。
static int c =0; //全域性(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得來的10和20位元組的區域就在堆區。
strcpy(p1, "123456"); //"123456\0"放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}