内存分区 复习

内存分区,复习
内存四区:
代码区,全局区,栈区,堆区。
1.1 代码区和全局区
内存分区
代码区和全局区

全局区存放的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.2 栈区
栈区

#include<iostream>
using namespace std;

//栈区数据注意事项 -- 不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放

int * func(int b) //形参数据也会放在栈区
{
	int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
	return &a;//返回局部变量的地址
}
int main() 
{
	int* p = func(1);
	cout << *p << endl;//第一次输出10
	cout << *p << endl;//第二次输出乱码
	system("pause");
	return 0;
}

局部变量放在栈上,栈上数据的特点是,当该函数执行完,栈上的数据就清空了。第一次能正常输出10是因为,编译器对该内存上的地址做了一次保留。

1.3 在堆区创建数据

#include<iostream>
using namespace std;
int * func() 
{
	int a = 10;
	return &a;//局部变量的地址用指针返回,在变量释放之后,再操作这个内存就是非法操作了,这是栈上的特点。
	//指针 本质是局部变量,放在栈上,指针保存的的数据放在堆区。
	int * p = new int(10);
	return p;
}
int main() 
{
	//在堆区开辟数据
	//堆区的数据由程序员手动释放。
	int* p = func();
	cout << *p << endl;
	system("pause");
	return 0;
}

栈区内存上存放着指向堆区的地址,在堆区上开辟数据并用指针接收
堆区上的数据的释放
在这里插入图片描述

#include<iostream>
using namespace std;
int * func() 
{
	//在堆区创建整形数据
	//new返回的是 该数据类型的指针
	int* p = new int(10);
	return p;
}
void test01()
{
	//创建10个整形数据的数组,在堆区
	int* arr = new int[10];
	for (int i = 0; i < 10;i++)
	{
		arr[i] = i * 10;
	}
	for (int i = 0; i < 10;i++)
	{
		cout << arr[i] << endl;
	}
	//释放堆区数组时,要加[]才可以
	delete[] arr;
}
int main() 
{
	int* p = func();
	cout << *p << endl;
	cout << *p << endl;
	//堆区的数据由程序员管理开辟和,手动释放
	//释放堆区数据用关键字delete
	delete p;
	test01();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值