[C语言]内存问题之返回局部变量地址
2023-02-18 15:41:52 时间
来看这样一段代码
int func() { int a = 2; return &a; } void main() { int* p = fun(); *p = 20; }
这段代码非常简单,func 函数返回一个指向局部变量的地址,main 函数中调用 func 函数,获取到指针后将其设置为 20。
你能看出这段代码有什么问题吗?
问题在于局部变量 a 位于 func 的栈帧中,当 func 执行结束,其栈帧也不复存在,因此 main 函数中调用 func 函数后得到的指针指向一个不存在的变量:
尽管上述代码仍然可以“正常”运行,但如果后续调用其它函数比如funcB,那么指针p指向的内容将被 funcB 函数的栈帧内容覆盖掉,又或者修改指针 p 实际上是在破坏 funcB 函数的栈帧,这将导致极其难以排查的 bug。
相关文章
- 你需要知道的这几种 asp.net core 修改默认端口的方式
- 使用kibana可视化报表实时监控你的应用程序,从日志中找出问题,解决问题
- 小步快跑的公司可以最简化操作直接通过log4net将日志写入ElasticSearch
- spark集群搭建整理之解决亿级人群标签问题
- 继续吐槽在net下没有合适的Disk Cache之使用EhCache
- 吐槽net下没有靠谱的FastDFS的sdk之使用thrift实现JAVA和C#互通
- 你需要了解的高可用方案之使用keepalived搭建双机热备一览
- 全内存的redis用习惯了?那能突破内存限制类redis产品ssdb呢?
- 把项目中那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建
- 通过ELK快速搭建一个你可能需要的集中化日志平台
- 通过hadoop + hive搭建离线式的分析系统之快速搭建一览
- 使用nginx搭建高可用,高并发的wcf集群
- 如何大幅提升web前端性能之看tengine在大公司架构实践
- 缓存一致性和跨服务器查询的数据异构解决方案canal
- 高CPU业务场景下的任务分发方案Gearman搭建一览
- 改造继续之eclipse集成tomcat开发spring mvc项目配置一览
- .net项目架构改造之搭建基于java环境配置一览【上】
- 用java调用.net的wcf其实还是很简单的
- 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】
- 采用config方式灵活配置我们的Quarz.net中的Job,Trigger