c理解提高(3)程序的内存四区模型和函数调用模型

程序的内存四区模型


内存四区的建立流程

c理解提高(3)程序的内存四区模型和函数调用模型

流程说明

1、操作系统把物理硬盘代码load到内存

2、操作系统把c代码分成四个区

3、操作系统找到main函数入口执行

 

各区元素分析

c理解提高(3)程序的内存四区模型和函数调用模型


函数调用模型


基本原理

c理解提高(3)程序的内存四区模型和函数调用模型

c理解提高(3)程序的内存四区模型和函数调用模型

内存四区模型和函数调用模型变量传递分析

1、一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?

2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期?

分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?)

c理解提高(3)程序的内存四区模型和函数调用模型

提示学好C语言的关键

c理解提高(3)程序的内存四区模型和函数调用模型

 

如何建立正确的程序运行内存布局图

  • 内存四区模型&函数调用模型
  • 函数内元素
    • 深入理解数据类型和变量“内存”属性
    • 一级指针内存布局图(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");
}