1.代码区: 存放函数体的二进制代码,由操作系统进行管理
2.全局区: 存放全局变量和静态变量以及常量,数据在程序结束后由操作系统释放
存放内容:全局变量、静态变量、常量区(字符串常量和其他常量)
3.栈区: 由编译器分配和释放,存放函数的参数值,局部变量等
栈区数据注意事项:不要返回局部变量地址
4.堆区: 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
利用关键字new在堆区开辟内存;
int *p = new int (10); //指针本身为局部变量,放在栈区;但是指针指向的数据存放在堆区
demo.cpp
#include <iostream>
using namespace std;
int x=1; //全局变量x y 全局区
int y=2;
const int c_x=1; //全局常量c_x c_y 全局区
const int c_y=2;
void func1()
{
int a=1; //局部变量a b 栈区
int b=2;
const int c_a=1; //局部常量 栈区
const int c_b=2;
static int s_a=1; //静态变量 s_a s_b 全局区
static int s_b=2;
int *p1 = new int (10); //指针本身为局部变量,放在栈区;但是指针指向的数据存放在堆区 堆区
int *p2 = new int (20);
int *arr =new int[10];
for (int i = 0; i < 10; ++i)
arr[i]=i;
cout<<"全局区:"<<endl;
cout<<"全局变量x地址:"<<&x<<endl;
cout<<"全局变量y地址:"<<&y<<endl;
cout<<"全局常量c_x地址:"<<&c_x<<endl;
cout<<"全局常量c_y地址:"<<&c_y<<endl;
cout<<"静态变量s_a地址:"<<&s_a<<endl;
cout<<"静态变量s_b地址:"<<&s_b<<endl;
cout<<"字符串常量ustc_zs地址"<<&"ustc_zs"<<endl;
cout<<endl;
cout<<"*****************************"<<endl;
cout<<endl;
cout<<"栈区:"<<endl;
cout<<"局部变量a地址:"<<&a<<endl;
cout<<"局部变量b地址:"<<&b<<endl;
cout<<"局部常量c_a地址:"<<&c_a<<endl;
cout<<"局部常量c_b地址:"<<&c_b<<endl;
cout<<endl;
cout<<"*****************************"<<endl;
cout<<endl;
cout<<"堆区:"<<endl;
cout<<p1<<endl; //p1 p2存放的为堆区数据10 20 的地址
cout<<p2<<endl;
cout<<arr<<endl;
delete p1; //释放堆区数据
delete p2;
delete[] arr; //加[]代表释放数组,释放一段数据
}
int main()
{
std::cout << "Hello, World!" << std::endl;
func1();
return 0;
}
输出结果: