84 内存四区

代码运行前

  1. 代码区:存放函数体二进制代码,由操作系统进行管理

  2. 全局区

#include<iostream>
using namespace std;
//全局变量:在main函数外的变量
int g_a = 10;
int g_b = 10;
//const修饰的全局变量
const int c_g_a = 10;
int main()
{
	cout << "全局变量g_a的地址为:" << (int)&g_a << endl;
	cout << "全局变量g_b的地址为:" << (int)&g_b << endl;
	cout << "const修饰的全局变量c_g_a的地址为:" << (int)&c_g_a << endl;
	//静态变量:在普通局部变量前加tatic
	static int s_a = 10;
	static int s_b = 10;
	cout << "静态变量s_a的地址为:" << (int)&s_a << endl;
	cout << "静态变量s_b的地址为:" << (int)&s_b << endl;
	//局部变量
	int a = 10;
	int b = 10;
	cout << "局部变量a的地址为:" << (int)&a<< endl;
	cout << "局部变量b的地址为:" << (int)&b << endl;
	//常量
	//字符串常量
	cout << "字符串常量的地址为:" << (int)&"hello" << endl;
	//const修饰的局部变量
	const int c_l_a = 10;
	cout << "const修饰的局部变量的地址为:" << (int)&c_l_a << endl;

	system("pause");
	return 0;
}

84 内存四区

代码运行后

  1. 栈区
#include<iostream>
using namespace std;
int* func(int b = 100)
{
	int a = 10;//a是局部变量,局部变量存放在栈区,程序执行完后自动释放
	return &a;
}
int main()//b是形参,也会放在栈上

{
	//接收func函数的返回值
	int* P = func(1);
	cout << *P<< endl;//第一次编译器会保留数据,所以编译正确
	cout << *P << endl;//编译器只会保留一次,所以第二次打印会出错,所以不要返回局部变量的地址
	system("pause");
	return 0;
}

84 内存四区

  1. 堆区
#include<iostream>
using namespace std;
int* func()
{
	//在堆区创建一个数据
	//利用new关键字在堆区开辟一块内存,它返回的是地址的编号,我们要用指针区接收它。
	//利用new开辟的数据,会返回该数据类型对应的指针
	//利用new开辟的数据需要用delete释放
	int *p=new int(10);
	return p;
	
}
//new的语法
void test_01()
{
	int* p = func();
	//堆区的数据由程序员管理开辟和释放,调用地址时不会出错
	cout << "test_01输出值    "<<*p << endl;
	delete p;
	//cout << "test_01输出值    " << *p << endl;内存已释放,再次读取是非法操作
}

//利用new语法开辟一个数组
void test_02()
{
//创建一个有10个整型数据的数组在堆区
	int * arr=new int[10];//这里的10不是初始值,而是数组中元素个数,返回的是这个数组连续内存的首地址
	for (int i = 0; i < 10; i++)
	{
		arr[i] = 100 + i;
	}
	for (int i = 0; i < 10; i++)
	{
		cout<<"test_02输出值  "<<arr[i]<<endl;
	}
	delete[]arr;//释放一个数组,数组指针名是arr
}
int main()
{
	int* p = func();
	cout << "01-*p输出值   "<<*p << endl;
	cout <<"02-p的输出值   "<< p << endl;
	test_01();
	test_02();
	system("pause");
	return 0;
}

84 内存四区

上一篇:[20210404]JZM的国赛路


下一篇:84-85