c++程序在执行时,将内存大方向划分为四大区域
1.代码区(存放CPU执行的机器指令)
存放函数体的二进制代码,由操作系统进行管理
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是只读的,使其只读的原因是防止程序意外的修改了他的指令
2.全局区
存放全局变量和静态变量以及常量
全局区还包含了常量区,字符串常量和其他常量也存放在此
局部变量不在于此
3.栈区
由编译器自动分配释放,存放函数的参数值,局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
#include<iostream>
using namespace std;
int* fun(int b) {//形参也在栈中存储
b = 10;
int a = 10;
return &a;//不要返回局部变量的地址
}
int main() {
int *p= fun(2);
cout << "*p=" << *p << endl;//第一次能返回是以为编译器的缓存
cout << "*p=" << *p << endl;//第二次返回就出现了错,因为局部变量已经被释放
}
#include<iostream>
using namespace std;
int* fun(int b) {
b = 20;
int a = 10;
return new int[]{a,b};
}
int main() {
int* p = fun(2);
cout << "p[0]=" << p[0] << endl;
cout << "p[1]=" << p[1]<< endl;
}
4.堆区
由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
#include<iostream>
using namespace std;
int* fun(int b) {
b = 20;
int a = 10;
//使用new 将数据开辟到堆区
return new int[]{a,b};
}
int main() {
//指针本质也是局部变量,放在栈上,指针保存的数据放在堆区
int* p1 = fun(2);
int* p2 = new int(30);
cout << "p1[0]=" << p1[0] << endl;
cout << "p1[1]=" << p1[1]<< endl;
cout << "*p2=" << *p2 << endl;
//堆区上的数据由程序员释放
delete []p1;
delete p2;
//cout << "p[0]" = p[0] << endl;无法输出
}