这是栈人
在这种特殊情况下,它可能与函数中变量的内存分配方式有关。
有一块连续的内存块是为函数变量保留的,称为堆栈。
当您调用一个函数时,堆栈的一部分是为该函数保留的,这就是该函数中变量值的存储位置。
当你退出函数时,堆中的那部分不再保留,将被下一个调用的函数使用。但是,其中的值不会被清零,值仍然存在。
因此,在这种情况下,如果您不初始化函数变量,它将包含堆栈中发生的任何内容。
在这种情况下,由于您一遍又一遍地调用相同的函数,剩下的内容将是可预测的。但在大多数情况下,您会遇到问题并且无法预测。
例如,如果您在两者之间调用不同的函数。
在两者之间调用不同的函数时中断
#include<stdio.h>
void t();
void otherFunction();
int main(void){
t();
otherFunction();
t();
t();
return 0;
}
void t(){
int i;
i++;
printf("%d\n",i);
}
void otherFunction(){
int x = 10;
}
输出:
1
11
12
如果 x() 在堆栈的更深处调用,它的行为也不会相同:
从堆栈的不同深度调用时中断
#include<stdio.h>
void t();
void callT();
int main(void){
t();
callT();
t();
t();
return 0;
}
void t(){
int i;
i++;
printf("%d\n",i);
}
void callT(){
t();
}
输出:
1
1
1
2
谈论未定义的行为,我什至无法解释。
在我们的示例中更糟糕的是使用int 或在我们的函数中不使用任何内容。堆栈不知道堆栈中的数据类型,它只是一堆字节。因此,您最终可能会遇到数据被错误地解释为另一种类型的情况。
例如,假设其中一个函数使用浮点数而不是整数。
使用不同类型时中断
#include<stdio.h>
void t();
void assignFloat();
int main(void){
t();
assignFloat();
t();
t();
return 0;
}
void t(){
int i;
i++;
printf("%d\n",i);
}
void assignFloat(){
float x = 10;
}
输出:
1
1092616193
1092616194
这不是您总是会遇到的行为,该行为是“未定义的”,这意味着您无法预测从编译器到编译器甚至从一个编译器配置到另一个编译器的行为。未定义意味着它不可靠,你不应该这样做。
此答案中的示例使用以下方法进行了测试:
g++ (GCC) 5.3.1 20151207(红帽 5.3.1-2)
使用在线工具:
http://www.tutorialspoint.com/compile_cpp_online.php