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

2022-08-21 10:42:10 字數 2178 閱讀 2460

圖1-1

記憶體四區模型是c語言學習的乙個重點也是乙個難點,大多程式設計師往往注重**的編寫而不注重**在執行中所進行的記憶體的變化而導致程式出現問題,嚴重時導致程式失控崩潰.

圖1-1很直觀的表示記憶體當中儲存的資料型別,以及記憶體之間的關聯。

1.c語言的記憶體區分

1.1 記憶體四區

1.1.1 **區

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

1.1.2 靜態區

所有的全域性變數以及程式中的靜態變數,以及字串都儲存到靜態區, c編譯器對於相同的字串會自動進行優化分配為統一的位址。

1.1.3 棧區

棧stack是一種先進後出的記憶體結構,所有的自動變數,函式的形參都是由編譯器自動放出棧中,當乙個自動變數超出其作用域時,自動從棧中彈出。

1.1.4 堆區

堆heap和棧一樣,也是一種在程式執行過程中可以隨時修改的記憶體區域,但沒有棧那樣先進後出的順序。

堆是乙個大容器,它的容量要遠遠大於棧,但是在c語言中,堆記憶體空間的申請和釋放需要手動通過**來完成。

2.c語言的記憶體分析

1,下面對這這幾區域進行分析。棧區 最重要的特性是先進後出的記憶體結構,當函式執行完成後,自動釋放開闢給函式以及該函式的變數的記憶體,正是因為棧的這種特性使得變數有作用域的說法,main是程式的入口,可以理解為他是最先入棧的函式,所以他最後被釋放。棧的方向(編譯器給函式分配的位址)不一定是向上的(位址遞增)也可能是向下(位址遞減)。

2靜態區的理解:

1

#define _crt_secure_no_warnings

2 #include 3 #include

4 #include 5

6char *getstr1()711

char *getstr2()

1216

17void

main55()

18

分析以上**發現指標所指的位址是一樣,原因在於字串是儲存在靜態區的,相同字串,系統並不會重新開闢空間。這樣做可以減少**所占有的記憶體。

3 堆(heap)與棧(stack)的區別

//堆區開闢記憶體
#define  _crt_secure_no_warnings #include 

#include

#include //堆

char *getmem(int

num)

return

p1;}

void

main()

strcpy(tmp,

"111222

"); //

向tmp做指向的記憶體空間中copy資料

printf(

"hello..tmp:%s.\n

", tmp);

system(

"pause");

return

;}

//棧區開闢記憶體
define  _crt_secure_no_warnings #include 

#include

#include

char *getmem1()

void

main()

strcpy(tmp,

"111222

"); //

向tmp做指向的記憶體空間中copy資料

printf(

"hello..tmp:%s.\n

", tmp);

system(

"pause");

return

;}

堆區和棧區的不同在於函式執行後會不會自動的釋放記憶體空間。棧會自動釋放,所以**2輸出時亂碼,因為buf位址中的內容在getnum1()執行完畢之後被釋放了,所以buf位址的內容是亂碼。而**1開闢的空間是在堆區,所以不會自動釋放內容。注意一般使用molloc()和free()這兩個函式來開闢堆區的記憶體。

當開闢空間,不需要後要對記憶體進行釋放。

記憶體空間的概念十分重要,影響了對指標的理解。而指標又是c語言的精髓。所以十分重要。

記憶體四區模型

記憶體可以先粗略的分為四個區,分別是 區,資料區,棧區和堆區。其中,資料區可以分為全域性區 靜態區 常量區。資料區內容的生命週期從程式開始到程式終止 棧區的內容從函式左括號開始,到右括號為止,函式結束後,記憶體自動釋放 堆區的內容由程式設計師自己開闢,手動釋放。區 程式指令 資料區 全域性區 靜態區...

c語言記憶體四區( )

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

C語言記憶體四區

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