記憶體四區
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 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方...