堆和棧的區別與簡單操作

2021-08-15 08:35:57 字數 1341 閱讀 4243

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 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...