詳解C語言中的記憶體四區模型及結構體對記憶體的使用

2022-10-04 01:57:07 字數 1691 閱讀 9398

記憶體四區

1、**區

**區code,程式被作業系統載入到記憶體的時候,所有的可執行**都載入到**區,也叫**段,這塊記憶體是不可以在執行期間修改的。

2、靜態區

所有的全域性變數以及程式中的靜態變數都儲存到靜態區。

3、棧區

棧stack是一種先進後出的記憶體結構,所有的自動變數,函式的形參都是由編譯器自動放出棧中,當乙個自動變數超出其作用域時,自動從棧中彈出。對於自動變數,什麼時候入棧,什麼時候出棧,是不需要程式控制的,由c語言編譯器。實現棧不會很大,一般都是egxvogur以k為單位的。

當棧空間以滿,但還往棧記憶體壓變數,這個就叫棧。溢位對於乙個32位作業系統,最大管理管理4g記憶體,其中1g是給作業系統自己用的,剩下的3g都是給使用者程式,乙個使用者程式理論上可以使用3g的記憶體空間。

注意:c語言中函式引數入棧的順序是從右往左。

4、堆區

堆heap和棧一樣,也是一種在程式執行過程中可以隨時修改的記憶體區域,但沒有棧那樣先進後出的順序。堆是乙個大容器,它的容量要遠遠大於棧,但是在c語言中,堆記憶體空間的申請和釋放需要手動通過**來完成。

**示例:

#include

int c = 0; // 靜態區

void test(int a, int b) // 形參a,b都在棧區

int *geta() // 函式的返回值是乙個指標

// int a的作用域就是這個{}

int main()

/* 輸出結果

100

2619740, 2619728, 9404720, 9404724, 9

2619512, 2619516

*/ 堆使用注意事項:

#include

#include

int *geta() // 錯誤,不能將乙個棧變數的位址通過函式的返回值返回

int *geta1() // 可以通過函式的返回值返回乙個堆位址,但記得,一定要free

int *geta2() // 合法的,但是記住這裡不能用free

void getheap(int *p)

// getheap執行完之後,p就消失了,導致他指向的具體堆空間的位址編號也隨之消失了

// 這裡發生了記憶體洩漏

void getheap1(int **p)

// 這裡的操作就是正確的

int main()

結構體內存對齊模式

結構體內存對齊模式各種情況詳解

#include

struct a ;

struct b ;

struct c ;

struct d ;

struct e ;

struct f

; 結構體變相實現陣列賦值

struct 程式設計客棧name ;

int main()

; struct name a2 = ;

a2 = a1; // 這裡通過結構體可以賦值的特性變相實現了陣列的賦值

return 0;

}結構體內存洩漏

#include

#include

union a ;

int main()

本文標題: 詳解c語言中的記憶體四區模型及結構體對記憶體的使用

本文位址:

C語言記憶體四區模型分析

圖1 1 記憶體四區模型是c語言學習的乙個重點也是乙個難點,大多程式設計師往往注重 的編寫而不注重 在執行中所進行的記憶體的變化而導致程式出現問題,嚴重時導致程式失控崩潰.圖1 1很直觀的表示記憶體當中儲存的資料型別,以及記憶體之間的關聯。1.c語言的記憶體區分 1.1 記憶體四區 1.1.1 區 ...

c語言記憶體四區( )

圖1 記憶體四區模型 流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結...

C語言記憶體四區

圖一 記憶體四區模型 流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 一 記憶體四區 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方...