C89 論記憶體分配問題

2022-07-22 18:00:19 字數 1639 閱讀 7498

學習了這麼久的c/c++,還不知道這個,我也是很羞愧~

作業系統的記憶體管理方式有:1.重定位(relocation)

2.分段(segmentation)

3.分頁(paging)

4.虛擬儲存(virtual memory)

而作業系統的記憶體上各種占用著不同的程序,每個程序占用不同的記憶體空間

從上面的圖可以看到,除了最高位址的記憶體存放的是核心,使用者無法對該記憶體進行修改。

而棧存放在可分配記憶體的最高位置,在c/c++中,棧用來儲存函式引數從右到左,然後儲存區域性變數。

棧遵從lifo順序進行壓棧(push)和出棧(pop),記憶體分配由高到低

棧是有一定容量大小的,一般1m或者2m,而且棧的速度比堆塊

在棧的下方,是記憶體對映段。核心將內奸內容直接對映到記憶體之中

堆用於執行時記憶體分配,堆用來儲存那些生存期與函式無關的資料,記憶體分配由低到高

在c/c++中,使用malloc/free或者new/delete來分配堆記憶體

在c/c++中,bss段和資料段儲存的都是全域性變數和靜態變數的內容

但是bss段儲存的是未被初始化的變數,會預設初始化為零

資料段儲存的事已經初始化的變數

包含了程序執行的程式機器語言指令,文字段具有唯讀屬性,以防止程序通過錯誤指標意外修改自身的指令

也可以包含唯讀常量或者字串常量

解決辦法:在使用之前檢查指標是否為null

解決辦法:要賦初值

解決辦法:記憶體越界要檢查

解決辦法:要記得釋放記憶體

解決辦法:防止野指標

野指標是指向垃圾記憶體的指標,它不是空(null)指標,指向的記憶體區域是未可知的

在c/c++中記憶體分為五個區,分別是棧 自由儲存區  堆  全域性/靜態儲存區  常量儲存區,分別對應上面的程序五個區域

(1)malloc/free

(2)new/delete

void* calloc(unsigned n,unsigned size);

用calloc函式可以為一維陣列開闢動態儲存空間,n為陣列元素個數,每個元素長度為size,函式返回值指向所分配域的起始位置的指標.如果分配不成功,返回null

calloc在動態分配完記憶體後,自動初始化該記憶體空間為零,而malloc不初始化,裡邊資料是隨機的垃圾資料

C89 標頭檔案

雙引號 搜尋使用者所在目錄,如果找不到搜尋系統指定的目錄 尖括號 僅僅搜尋系統指定目錄 include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 i...

C89 論結構體 列舉體 聯合體的使用

一般用在多種不同資料型別集合裡面,便於 整潔,用於封裝便於再次利用 struct預設是public,class預設是private 1.有結構名 struct a struct a a 2.有結構名和結構物件 struct ao struct a a 3.只有結構物件 structo,array 1...

c 記憶體分配問題

首先分為 區和資料區 資料區分為 靜態資料區,動態資料,動態資料區 堆區和棧區 區存放程式 靜態資料區 存放編譯時就分配記憶體的變數,生命週期貫穿整個程式執行過程,所有程式執行完畢後自動釋放。堆區 由程式猿安排分配和釋放的變數,通過malloc free.new delete管理。棧區 存放函式的形...