C開發中的堆和棧

2021-09-11 19:26:12 字數 1893 閱讀 5358

由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 例如,宣告在函式中的乙個區域性變數int b;系統自動在棧中為b開闢空間。只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。比如:

char* allocstrfromstack()

對於該函式,那塊pstr的內存在函式返回時就被系統釋放了,只在函式內部呼叫時才有,其實返回的char*什麼也沒有。

為此做過乙個實驗:

#include "stdafx.h"

#include "string.h"

char *addreturn()

int main(int argc, char* ar**)

printf("hello world!\n");

return 0;

}

addreturn返回的不是有效內容,故main中的輸出是亂碼。在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,如果申請的空間超過棧的剩餘空間時,將提示overflow。

一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。可能用到的關鍵字如下:new、malloc、delete、free等等。在c中malloc函式如p1 = (char *)malloc(10);但是注意p1本身是在棧中的,因為他們還是可以認為是區域性變數。比如:

char* allocstrfromheap(int len)

該函式返回的記憶體沒有問題,可以被使用。但一定要呼叫free釋放,不然就是memory leak記憶體洩漏!

作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣**中的delete語句才能正確的釋放。堆是向高位址擴充套件的資料結構,是不連續的記憶體區域(這是由於系統是用鍊錶來儲存的空閒記憶體位址的)。

#include "stdafx.h"

#include #include int main(int argc, char* ar**)

堆的做法:

char *getmemory()

棧的做法:

char *getmemory()

用堆可以執行出結果,棧則不行,出現警告warning c4172: returning address of local variable or temporary。所以在函式內部返回申明定義的位址空間,一旦出了該函式就是無效的,所以不能這樣用。利用函式返回記憶體位址來操作的,如果利用形參返回位址來操作,有下面兩個一錯一對的函式段來比較。主函式是:

#include "stdafx.h"

#include #include void func(char *p)

int main(int argc, char* ar**)

開始一直以為上面這個是正確的,編譯執行時才發現不通過。關鍵原因是str1是個null指標,它不可作為形參出入進行操作。下面乙個是正確的:

#include "stdafx.h"

#include #include void func(char **p)

int main(int argc, char* ar**)

str1雖然還是空,但是傳入func的是這個空指標的記憶體位址,是可以操作。

c 中的堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

c 中的堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

C 中的堆和棧

在c 中,記憶體分為5個區 堆 棧 自由儲存區 靜態儲存區 或全域性儲存區 和常量儲存區。堆和棧都是c 的記憶體儲存區之一,下面介紹堆和棧對比用法 棧是機器系統提供的資料結構,是filo first in last out 結構,計算機底層對它進行了支援,棧的記憶體分配內置於處理器的指令集 分配了專...