C/C++ 未定义行为会导致不可预测的结果,还会有非常奇葩,让人非常困惑的结果。这次是因为变量没有初始化 @_@...
看下面这个例子,b()
中的两个变量没有初始化,而且它们和 a()
中的两个变量同名。
#include<stdio.h>
void a(void);
void b(void);
int main(void)
{
foo();
bar();
}
void foo(void)
{
int var1 = 1, var2 = 2;
printf("var1 = %d, var2 = %d\n", var1, var2);
}
void bar(void)
{
int var1, var2;
printf("var1 = %d, var2 = %d\n", var1, var2);
}
神奇的是,运行后会发现 bar()
的输出并不为空,而且和 foo()
的输出是一样的,反复尝试几次都是这样。如果仅仅没有初始化的话,bar()
中的本地变量也应该是 0 或者其他垃圾随机值,为什么会等于 foo()
中的同名变量??? 本地变量的作用范围难道不是只在函数中嘛???
这和本地变量的堆/栈数据存储有关,看回答 >_> stackoverflow 和 stackoverflow 。简言之,本地变量是按照栈的方式存储。出现上面这种函数间变量互相污染的情况,很有可能是第一个函数的栈被释放后,又被后面的函数复用。然而这种现象并不能保证在不同的环境中/使用不同的编译器时 100% 复现(不论用 gcc 还是 clang 还是 llvm+gcc, 我的结果是一样的 ???)。
上面 stackoverflow 中举了这个例子,评论里有人得到乱码结果,然而我再次得到被污染的结果,再次黑人问号脸
#include<stdio.h>
#include <stdlib.h>
int * foo(){
int a = 5;
return &a;
}
void boo(){
int a = 7;
}
int main(){
int * p = foo();
boo();
printf("%d\n",*p);
}
总之一定不要忘了初始化变量 >_< 这真是太神奇了...