圖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堆區和棧區的不同在於函式執行後會不會自動的釋放記憶體空間。棧會自動釋放,所以**2輸出時亂碼,因為buf位址中的內容在getnum1()執行完畢之後被釋放了,所以buf位址的內容是亂碼。而**1開闢的空間是在堆區,所以不會自動釋放內容。注意一般使用molloc()和free()這兩個函式來開闢堆區的記憶體。#include
#include
char *getmem1()
void
main()
strcpy(tmp,
"111222
"); //
向tmp做指向的記憶體空間中copy資料
printf(
"hello..tmp:%s.\n
", tmp);
system(
"pause");
return
;}
當開闢空間,不需要後要對記憶體進行釋放。
記憶體空間的概念十分重要,影響了對指標的理解。而指標又是c語言的精髓。所以十分重要。
記憶體四區模型
記憶體可以先粗略的分為四個區,分別是 區,資料區,棧區和堆區。其中,資料區可以分為全域性區 靜態區 常量區。資料區內容的生命週期從程式開始到程式終止 棧區的內容從函式左括號開始,到右括號為止,函式結束後,記憶體自動釋放 堆區的內容由程式設計師自己開闢,手動釋放。區 程式指令 資料區 全域性區 靜態區...
c語言記憶體四區( )
圖1 記憶體四區模型 流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結...
C語言記憶體四區
圖一 記憶體四區模型 流程說明 1 作業系統把物理硬碟 load到記憶體 2 作業系統把c 分成四個區 3 作業系統找到main函式入口執行 一 記憶體四區 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方...