内存四区(栈)

今天我再次学到了有趣的知识,内存四区!

内存四区分为代码区,全局区,栈区,堆区,今天我们详细来讲讲栈区!

内存四区和栈区都是用来存放数据的,而栈区存放的数据具体有两类

1.形参数据,具体也就是指主函数外的函数体,所用到的形参数据,都会保存在栈区

int fung(int  b)//

就像int b,就会保存在栈区

2.局部变量,局部变量都会储存在栈区,什么是局部变量,相信也不用我多说了!总之在函数体以内的,都是局部变量。

注意:不要返回局部变量的地址,编译器会自动开辟和释放。

上面这句话,是什么意思?

很简单,就是在定义函数体的时候,有的时候会有返回值,这个返回值就不能是函数体以内的局部变量。

#include<iostream>
using namespace std;
#include<string>
//在栈区中存放两类数据,一是形参,二是局部变量
int*fung()
{
    int c = 10;//不要返回局部变量的地址,编译器会自动开辟和释放
    return &c;
}

int main()
{
    int *p = fung();
    cout << *p << endl;
    return 0;
}

就像上面的代码这样就是错误的。他的结果是什么呢?

什么原因我会说它是错误的呢?

这是因为主函数外的函数体内的局部变量,编译器会自动开辟和释放,函数一结束,就会清空,所以第一次可以打印,第二次就可能是乱码,当然有些编译器会自动保留一次,但第二次就会清除,即便它侥幸没有被清除,但它也会面临因为再次调用其他函数,导致栈空间被覆盖等原因,随时被清理掉

所以写代码的时候,不要返回局部变量的地址 。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值