先看如下代码, 在编译运行的时候会抛出警告——-warning C4172: 返回局部变量或临时变量的地址,并且在main函数中的打印结果不符合我们的预期
代码如下:
int* visitArea(){
int a = 10;
return &a;
}
int main(){
int* a = visitArea();
printf("%d\n", *a);
printf("%d\n", *a);
printf("%d\n", *a);
return 0;
}
打印结果:
10
-2
-2
请按任意键继续. . .
我们通过上面可以发现main函数调用visitArea ,返回visitArea中的局部变量的地址,然后赋值给main函数中的变量进行打印, 第一个printf语句打印出了符合我们预期的结果,但是接下来的两个语句打印的结果不符合我们的预期, 这是为什么呢?
在C语言中,局部变量是分配在栈空间上的, 当函数调用结束后,他由编译器释放. 我们通过调用visitArea得到了他的局部变量的内存地址, 然而在第二次打印的时候他这个内存地址被”破坏”了, 所以出现了这个意想不到的结果.
所以我们在书写C语言程序时候, 如果返回指针(变量地址),应该返回堆区或者全局区的,这样就可以避免这个”意想不到的”结果