[C语言]内存问题之返回局部变量地址
2023-02-18 15:37:08 时间
来看这样一段代码
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。
相关文章
- [TCP/IP] 关闭连接后为什么客户端最后还要等待2MSL
- [TCP/IP] TCP关闭连接为什么四次挥手
- [PHP] Yaf框架的简单安装使用
- [PHP] 链表数据结构(单链表)
- [PHP] 三种运行模式 ISAPI模式 APACHE2HANDLER模式 CGI模式 FastCGI模式
- [MySQL] 为什么要给表加上主键
- [TCP/IP] ping traceroute和TTL
- [TCP/IP] TCP如何保证可靠性
- [TCP/IP] TCP如何实现流量控制和拥塞控制
- [TCP/IP] TCP在listen时的参数backlog的意义
- [TCP/IP]TCP服务端accept发生在三次握手的哪一个阶段
- [TCP/IP] 三次握手过程中有哪些不安全性
- [TCP/IP] TCP第三次握手失败怎么办
- [MySQL] 事务的ACID特性
- [TCP/IP] TCP的重发机制是怎么实现的
- [PHP] 重回基础(IO流)
- [TCP/IP] TCP报文长度是由什么确定的
- [PHP] 重回基础(Array相关函数)
- [TCP/IP] TCP的报文头
- [PHP] 重回基础(date函数和strtotime函数)