程序的内存四区模型
内存四区的建立流程
流程说明
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");
}