C语言定义返回值为指针的函数时请注意!

本文深入探讨了C语言中常见的指针陷阱——返回局部变量地址的问题。解释了局部变量存储在栈中,函数结束时其空间被释放,导致返回的指针指向无效地址。文章提出了两种解决方案:使用静态局部变量或堆区动态分配内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言初学者,记得学数据结构的时候,在操作动态链表,栈,队列时经常用指针作为函数参数和返回值,但是自己做练习时尝试的一个小程序却总提示 【Warning】address of local variable ‘某变量’ returned [-Wreturn-local-addr]  痛苦的排查了半天,终于找到了在一篇博文中找到了答案,赶紧趁热总结一下!

先看一下这个警告:一个指向局部变量(local variable)的指针作为了函数的返回值!问题就出在这了。

局部变量(也叫自动变量)从形式上看就是写在了于某一函数内部,当然也包括main函数。只有在调用某一函数时,其中的局部变量才被自动地分配存储空间,这里的存储空间指内存中的动态存储区,也就是我们常说的栈中。因此,如果函数返回的指针指向了这样一个局部变量,那么函数执行完毕后,指针原本指向的存储区域其实已经被释放,此时的指针的返回值带回的是一个无用的地址!

好的,现在清楚了不能把指向局部变量的指针作为函数返回值!但是我们绝对可以肯定的是存在指针函数(返回值为指针类型的函数),那能够作为函数返回值的指针应该满足什么条件呢?

函数调用结束后,指针所指向的数据存储区仍然存在,可用就可以!这样的存储区主要有:

1、内存中静态存储区。这里开辟的存储空间在程序运行期间一直存在,并且对所有函数可见。因此可以把局部变量定义为静态局部变量,如:static int  a;

当然定义为全局变量,不过大多时候一个全局变量,也就不需要再作为返回值出现了。

2、也可以用随时使用随时开辟的(通常用malloc函数申请)临时存放数据的堆区。在这里开辟的存储空间没有变量名,只能通过地址去调用,用完之后手动free()才会释放这一空间。C语言中动态链表或者可变数组正是这样实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

vane97

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

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

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

打赏作者

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

抵扣说明:

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

余额充值