[c语言] 返回栈空间地址 问题

当我们返回栈空间地址时会报错,为什么呢?那让我们先看一下什么是返回栈空间地址?

下面是错误示范:

vs2022版演示

70a343f019d84adc96bc3e75a8b2977b.png

 出现问题,不要慌,那我们就先调试一下。

经过调试我们惊奇的发现,编译器竟然没有报错。那让我们一步一步来分析这段代码。

1.程序从主函数开始,调用Test函数。

2.进入Test函数定义一个字符型指针str 置为空指针,str=调用GetMory函数的返回值。

3.进入GetMory函数,字符型的数组p 赋值为“hello”,return p;p是一个数组,return p;p是数组名,实际是返回的数组的首元素地址‘h’的地址。正好str也是一个指针,正好接收地址,再打印str

按理来说没什么问题啊,但为什么会打印 烫烫烫烫烫烫烫烫呢?

其实是因为GetMory函数中  char  p[]="hello";中p是一个局部的数组,在栈区上开辟的空间。当GetMory函数结束时,p就会自动销毁,也就是说p所开辟的空间就会还给操作系统,但p那块空间的地址还存在而且传给了str,当str顺着这个地址访问时,地址原来的空间已经被销毁了,不存在了,但我还要去访问那块空间,从而会出现非法访问问题,导致程序出错。

改进方法:

可以在  char  p[]="hello"前面加上一个static修饰,使p延长了生命周期。

08385f939a8646b2b2da54e05a3b1925.png

 

那有同学会问,如果返回的不是地址,是一个变量,能不能这样做呢?答案是肯定哒,yes

1b366c6069724a5382f65273c77f954a.png

 上面就是栈空间地址问题的讲解,总结一下简单可以理解为,函数调用如果返回值为一个局部地址,就会出错,除非返回变量,或加上static修饰。

另外加一个知识点,如果空间是在堆区上开辟的,堆区只有  free来释放空间,所以不存在返回占栈空间地址问题。

 

 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洁洁!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值