1、内存区分模型
1)、代码区:存放函数体的二进制代码,由操作系统进行管理;存放CPU执行的机器命令;代码区是共享和只读的
2)、全局区:存放全局变量和静态变量以及常量(字符串常量和其他常量);该区域的数据在结束后由``系统释放
2、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
#include <iostream>
#include <string>
using namespace std;
//栈区数据注意事项--不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int * func(int b)//形参也会在栈区
{
b = 100;
int a = 10;//局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
return &a;//返回局部变量的地址
}
int main()
{
//接受func()的返回值
int *p = func();
cout << *p << endl;//第一次可以打印正确的数字。因为编译器做了保留
cout << *p << endl;//第二次出错
system("pause");
return 0;
}
3、堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
#include <iostream>
#include <string>
using namespace std;
int *func()
{
//利用new关键字 可以将数据开辟到堆区
//指针本质也是局部变量,放在栈上,指针保存的数据是放在堆区
int *p = new int(10);
return p;
}
int main()
{
//在堆区开辟数据
int *p = func();
cout << *p <<endl;//10
cout << *p << endl;//10
cout << *p << endl;//10
system("pause");
return 0;
}