1、堆和棧的區別:
棧:一塊連續的記憶體區域,大小固定,不能存放大量資料,執行速度快。通常用於儲存函式引數、區域性變數等。由系統自動分配、釋放。
堆:不連續的記憶體區域,由鍊錶串聯起來。能獲得的空間大,能儲存大量資料,必須由程式設計師申請、釋放。
2、堆的操作
1)訪問堆
int i=10;
//申請乙個int型堆空間,將返回的位址賦值給指標p
//int *p =malloc(sizeof(int));
//申請的空間過大,不能正常申請,此時嚴格編譯器會報錯
//不是特別嚴謹的編譯器不報錯,但是執行會崩潰
//使用malloc申請失敗的時候,不會返回乙個正確的位址,只會返回null
int *p =malloc(4);
if (p==null)
else
2)釋放堆
//申請乙個int型堆空間,將返回的位址賦值給指標p
int *p =malloc(sizeof(int));
*p=90;
printf("%d\n",*p);
//釋放p指標指向的堆空間釋放
free(p);
//-572662307,輸出隨機資料,說明p指向的空間已經被釋放
//由於此時p指向的空間,資料不確定來自於哪兒,危險
//建議,釋放了空間的指標,最好賦值為0
p=0;
printf("%d\n",*p);
3)記憶體洩露:同乙個指標指向1個空間,又指向另乙個空間,之前空間沒有釋放掉,於是產生記憶體洩露。
//申請乙個int型堆空間,將返回的位址賦值給指標p
int *p =malloc(sizeof(int));
*p=90;
free(p);//將指標指向的空間釋放,避免記憶體洩露
p=malloc(sizeof(int));
*p=20;
printf("%d",*p);
4)迷途指標:指標指向的空間已經釋放掉了,不存在了,這樣的指標叫迷途指標。
//申請乙個int型堆空間,將返回的位址賦值給指標p
int *p =malloc(sizeof(int));//0x00382f68
long *ptr;
*p=90;
//釋放p指標指向的堆空間釋放
free(p);
//呼叫malloc函式開闢堆空間的時候,會將上一次釋放的空間
//賦給新定義的指標
ptr=malloc(sizeof(long));//0x00382f68
*ptr=100;
printf("%d\n",*p);
printf("%d\n",*ptr);
堆和棧的聯絡與區別
在 bbs上,堆與棧的區分問題,似乎是乙個永恆的話題,由此可見,初學者對此往往是混淆不清的,所以我決定拿他第乙個開刀。首先,我們舉乙個例子 void f 這條短短的一句話就包含了堆與棧,看到new,我們首先就應該想到,我們分配了一塊堆記憶體,那麼指標p呢?他分配的是一塊棧記憶體,所以這句話的意思就是...
堆與棧區別
檢視文章 關於記憶體中棧和堆的區別 2008 09 02 17 12 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器...
棧 與 堆 的區別
預備知識 堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...