五大記憶體分割槽

2021-07-30 01:16:22 字數 2467 閱讀 8528

[cpp]view plain

copy

print?

#include 

void

main()  

void

copy_string( 

char

*from, 

char

*to )  

*to = '\0'

;  }  

目的是拷貝乙個字串,編譯鏈結沒有報錯。但是在最後執行程式的時候出錯了。

在程式中是使用指標存放字串的。

進行除錯的時候,出現下面的報錯:

在小甲魚老濕的提示下,查詢了有關c/c++五大分割槽的知識

下面直接貼內容

在c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。

棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。 

堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。 

自由儲存區,就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。 

全域性/靜態儲存區,全域性變數和靜態變數被分配到同一塊記憶體中,在以前的c語言中,全域性變數又分為初始化的和未初始化的,在c++裡面沒有這個區分了,他們共同占用同一塊記憶體區。 

常量儲存區,這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改

一般認為在c中分為這幾個儲存區: 

1. 棧 --有編譯器自動分配釋放 

2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os** 

3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束釋放。 

4. 另外還有乙個專門放常量的地方。程式結束釋放 

在函式體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配記憶體的函式分配得到的就是在堆上。在所有函式體外定義的是全域性量,加了static修飾符後不管在**都存放在全域性區(靜態區),在所有函式體外定義的static變數表示在該檔案中有效,不能extern到別的檔案用,在函式體內定義的static表示只在該函式體內有效。另外,函式中的"adgfdf"這樣的字串存放在常量區。

比如: 

**: 

[cpp]view plain

copy

print?

inta = 0; 

//全域性初始化區 

char

*p1; 

//全域性未初始化區 

main()     

還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。 

棧的空間大小有限定,vc的預設是2m。棧不夠用的情況一般是程式中分配了大量陣列和遞迴函式層次太深。有一點必須知道,當乙個函式呼叫完返回後它會釋放該函式中所有的棧空間。棧是由編譯器自動管理的,不用你操心。 

堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態記憶體時是尋找匹配的記憶體的。而用棧則不會產生碎片。 

在棧上訪問資料比通過指標在堆上訪問資料快些。 

一般大家說的堆疊和棧是一樣的,就是棧(stack),而說堆時才是堆heap. 棧是先入後出的,一般是由高位址向低位址生長。

再看之前的**

[cpp]view plain

copy

print?

#include 

void

main()  

void

copy_string( 

char

*from, 

char

*to )  

*to = '\0'

;  }  

程式中的」you are a student.」字串在常量區,而使用指標存放字串,b中只是存放了字串在常量區中的位址,當呼叫copy_string函式的時候又引用了b這個引數,即試圖將字串」i am a teacher.」寫入常量區。而常量區的這段記憶體是不可寫的,所以在執行的時候出現了報錯。

對這段**的改進只許把b改為用陣列來存放字串(對a不必修改,因為程式中沒有執行對a寫入的操作)。

char *b = "you are a student.";

改為char b = "you are a student.";

五大記憶體分割槽

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

五大記憶體分割槽

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...

五大記憶體分割槽

五大記憶體分割槽 在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式...