1. 程式人生 > >c理解提高(3)程式的記憶體四區模型和函式呼叫模型

c理解提高(3)程式的記憶體四區模型和函式呼叫模型

程式的記憶體四區模型


記憶體四區的建立流程

流程說明

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");
}