計算機記憶體中的分割槽

2021-06-26 12:05:34 字數 1362 閱讀 3794

c語言中乙個簡單的指標練習題:

#include void  main()  

void copy_string( char *from, char *to )

*to = '\0';

}

功能是將字串a拷貝到字串b中去。編譯鏈結都ok,執行報錯。提示非法訪問。

下面直接貼內容

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

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

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

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

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

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

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

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

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

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

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

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

程式中的」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.";

計算機記憶體

1.1 計算機硬體記憶體架構。計算機cpu central processing unit 和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。使用者磁碟和cpu的互動,而cpu運轉速度越來越快,磁碟遠遠跟不上cpu的讀寫速度,才設計了記憶體,使用者快取使用者io等待導致cpu的等待成本。但是隨著...

計算機記憶體中的對齊

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平台對儲存空間的處理上有...

計算機記憶體定址

摘自 1 基本概念 cpu段式管理 段式管理的基本原理是指把乙個程式分成若干個段 segment 進行儲存,每個段都是乙個邏輯實體 logical entity 乙個使用者作業或程序所包含的段對應乙個二維線形虛擬空間,程式通過分段 segmentation 劃分為多個模組,故可以對程式的各個模組分別...