请看下面 的程序:
#include
int* fun() {
int a, *p = &a;
a=3;
return p;
}
int main()
{
int *s;
s = fun();
printf("s=%d\n",*s);
return 0;
}
你认为这个程序正确吗?
如果仅仅针对这个程序来说,可以说是正确的,如果这个程序后续仍然使用变量s的话会不会出错呢?
答案是会的。主要原因是C语言在处理局部变量时的局限性,fun()返回的值,保存在局部存储区(堆栈)中,当函数结束时,局部变量消失,虽然在主程序中仍然可以使用这个值,但它已经属于垃圾被系统自动回收。
运行下面的程序,查看运行结果,请问两次输出s的值都一样吗?
分析为什么会是这样的结果。
#include
int* fun() {
int a, *p = &a;
a=3;
return p;
}
void fun1() {
int a=4;
printf("a=%d\n",a);
return ;
}
int main()
{
int *s;
s = fun();
printf("s=%d\n",*s);
fun1();
printf("s=%d\n",*s);
return 0;
}
go语言在处理局部变量时就非常灵活,把上面的程序改成go语言编写,其运行结果可保证s的值不变。
package main
import (
"fmt"
)
func fun() (*int) {
a := 3
return &a
}
func fun1() {
a := 4
fmt.Printf("a=%d\n",a)
}
func main() {
s := fun()
fmt.Printf("s=%d\n",*s)
fun1()
fmt.Printf("s=%d\n",*s)
}
领取专属 10元无门槛券
私享最新 技术干货