[C语言]内存问题之返回局部变量地址

来看这样一段代码

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。 

posted @ 2021-03-06 21:29  陶士涵  阅读(28)  评论(0编辑  收藏