C 記憶體機制

2021-08-28 09:42:30 字數 1415 閱讀 9789

今天面試一頭霧水,學習c++的時候沒怎麼了解c++的記憶體機制,教科書上竟然沒有!what?老師上課只是提了一下,沒有說的很細,而且時間過去了好長時間,今天面試的時候面試官問我:」說一下你對c++記憶體機制的理解!「噗,一下慌了,只想起來堆,棧,還有全域性靜態,面試官笑了給我簡單講了一下還。回去之後趕緊仔細查閱資料,雖然面試涼了,但是卻讓我知道我還有**不足,趕緊給自己補習。總結如下,如有不妥之處,歡迎拍磚:

一.從靜態儲存區域分配:這塊內存在編譯的時候就已經分配好了,而不是編譯過程才分配,而且會一直存在於程式執行期間,例如全域性變數,還有static定義的變數。

二.從棧上建立:在函式執行的時候,那些區域性變數的儲存單元一般都建立在棧上,而且在函式執行結束時自動釋放,效率很高,但是儲存的容量有限,當然也可以修改。

三.從堆上建立:我們也稱之為動態記憶體分配,在程式執行中由程式設計師用malloc或new主動建立的記憶體,我們都建立在堆上,而且在程式結束的時候,也需要程式設計師通過free或delete主動釋放記憶體,使用靈活,但是如果使用不當會出現記憶體洩漏的問題,出現堆內碎塊。

一.堆區:  (heap)一般由程式設計師主動申請主動釋放(new,delete),但是如果程式設計師沒有主動釋放,那最後將由os(作業系統)**,分配方式類似資料結構中的鍊錶。

二.棧區:(stack)一般由編譯器主動分配和釋放,無需程式設計師釋放,一般用來存放函式的區域性變數,函式引數,返回資料,返回位址等,分配方式類似資料結構中的棧。

三.全域性區:(靜態區,static)一般用來存放全域性變數,靜態變數,常量,在程式結束的時候由系統釋放。

四.自由儲存區:一般由程式設計師用malloc()/calloc()/realloc()分配空間,由free()釋放,但如果程式設計師忘記free()了,則會造成記憶體洩漏,程式結束時可能會有作業系統**,這裡與c的堆機制對應。

五.常量儲存區:它是用來存放那些不可以改變的常量,程式結束的時候由作業系統釋放

(c和c++記憶體機制有些地方還是有些區別)

一.**區:(code area)

二.全域性資料區:(data area)

三.堆區:(heap area)

四.棧區:(stack area)

#include #include #include const int a=10;  //常量儲存區

int p = 0; // 全域性變數全域性初始化區

char* p1; // 全域性變數全域性未初始化區

int main()

c 記憶體機制

首先,來談談c 的5個儲存區 1.棧 是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。2.堆 由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動 3.自由儲存區 由malloc建立,由free釋放的動態記...

C語言記憶體機制

最近有參加一些c c 類的面試,感覺筆試的題目大都偏重於考察基本原理,這對我來說是乙個不小的挑戰 平時學習的時候往往忽視了那些基本原理,急於動手去實踐,結果忽視了靈魂性的東西 今後的學習中,禁忌一味動手寫 要結合理論多思考,多問些為什麼,不然就真成為了 民工了,知其然,知其所以然,才能成為大師 關於...

C語言記憶體機制詳解

對於乙個c語言程式而言,記憶體空間主要由五個部分組成 段 text 資料段 data bss段 bss 堆和棧組成,其中 段,資料段和bss段是編譯的時候由編譯器分配的,而堆和 在上圖中,由編譯器分配的位址空間都是在連線的時候分配的,而執行時分配的空間是在程式執行時由系統分配的 bss段 bss段 ...