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() 中的同名变量??? 本地变量的作用范围难道不是只在函数中嘛???

这和本地变量的堆/栈数据存储有关,看回答 >_> stackoverflowstackoverflow 。简言之,本地变量是按照栈的方式存储。出现上面这种函数间变量互相污染的情况,很有可能是第一个函数的栈被释放后,又被后面的函数复用。然而这种现象并不能保证在不同的环境中/使用不同的编译器时 100% 复现(不论用 gcc 还是 clang 还是 llvm+gcc, 我的结果是一样的 黑人问号.jpg ???)。

上面 stackoverflow 中举了这个例子,评论里有人得到乱码结果,然而我再次得到被污染的结果,再次黑人问号脸 黑人问号.jpg

#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);
}

总之一定不要忘了初始化变量 >_< 这真是太神奇了...