c理解提高(3)程式的記憶體四區模型和函式呼叫模型
阿新 • • 發佈:2018-10-31
程式的記憶體四區模型
記憶體四區的建立流程
流程說明
1、作業系統把物理硬碟程式碼load到記憶體
2、作業系統把c程式碼分成四個區
3、作業系統找到main函式入口執行
各區元素分析
函式呼叫模型
基本原理
記憶體四區模型和函式呼叫模型變數傳遞分析
1、一個主程式有n函式組成,c++編譯器會建立有幾個堆區?有幾個棧區?
2、函式巢狀呼叫時,實參地址傳給形參後,C++編譯器如何管理變數的生命週期?
分析:函式A,呼叫函式B,通過引數傳遞的變數(記憶體空間能用嗎?)
提示學好C語言的關鍵
如何建立正確的程式執行記憶體佈局圖
- 記憶體四區模型&函式呼叫模型
- 函式內元素
- 深入理解資料型別和變數“記憶體”屬性
- 一級指標記憶體佈局圖(int *,char*)
- 二級指標記憶體佈局圖(int ** char **)
- 函式間
- 主調函式分配記憶體,還是被呼叫函式分配記憶體
- 主調函式如何使用被呼叫函式分配的記憶體(技術關鍵點:指標做函式引數)
======》學習指標的技術路線圖
訓練題
記憶體四區強化訓練
01 全域性區訓練
- char *p1= “abcdefg”;
02 堆疊區生命週期訓練
- Char p1[]= “abcdefg”;
- 返回基本型別
- 返回非基本型別
03 堆疊屬性訓練
- 測試heap生長方向
- 測試stack生長方向
- Heap、stack生長方向和記憶體存放方向是兩個不同概念
- 野指標
- Malloc得到指標釋放問題測試
- free(p)
- free(p+1),深入理解
作業強化
訓練1 劃出記憶體四區
void main26() { char buf[100]; //byte b1 = new byte[100]; int a = 10; //分配4個位元組的記憶體 棧區也叫臨時區 int *p;//分配4個位元組的記憶體 p = &a; //cpu執行的程式碼,放在程式碼區 *p = 20; // { char *p = NULL; //分配4個位元組的記憶體 棧區也叫臨時區 p = (char *)malloc(100); //記憶體洩露概念 if (p != NULL) { free(p); } } system("pause"); } //全域性區程式碼測試 char * getstring1() { char *p1 = "abcde"; return p1; } char * getstring2() { char *p2 = "abcde"; return p2; } void main() { int i= 0; //指標指向誰就把誰的地址賦給指標變數。 char *p1 = getstring1(); char *p2 = getstring2(); char ******* p3 = NULL; //p3 是個變數 //指標變數和它所執行的記憶體空間變數是兩個不同的概念 strcmp(p1, p2); system("pause"); }
訓練2 劃出記憶體四區
void main01()
{
char buf[100];
//byte b1 = new byte[100];
int a = 10; //分配4個位元組的記憶體 棧區也叫臨時區
int *p;//分配4個位元組的記憶體
p = &a; //cpu執行的程式碼,放在程式碼區
*p = 20; //
{
char *p2 = NULL; //分配4個位元組的記憶體 棧區也叫臨時區
p2 = (char *)malloc(100); //記憶體洩露概念
if (p2 != NULL)
{
free(p2);
//p2 = NULL; 若不寫,實驗效果,分析原因
}
if (p2 != NULL)
{
free(p2);
}
}
system("pause");
}