我检查过自己,写了这样的程序
int main() {
int i;
cout << i;
return 0;
}
我运行了几次该程序,结果一直都是零。
我已经在C中尝试过,结果是一样的。
但是我的教科书说
当程序始终为变量分配可用存储位置时,这怎么可能?怎么可能不是零(我假设默认的可用内存值为零)?
最佳答案
让我们看一个示例实际实现。
假设它利用堆栈来保留局部变量。
void
foo(void)
{
int foo_var = 42;
}
void
bar(void)
{
int bar_var;
printf("%d\n", bar_var);
}
int
main(void)
{
bar();
foo();
bar();
}
上面完全破损的代码说明了这一点。调用foo之后,将在堆栈上放置foo_var的特定位置设置为42。当我们调用bar时,bar_var占据该确切位置。实际上,执行代码会导致打印0和42,这表明除非初始化就不能依赖bar_var值。
现在应该清楚需要局部变量初始化。但是主是否可以作为异常(exception)?有什么可能会影响堆栈,结果给我们一个非零值?
是。 main不是您的程序中执行的第一个函数。实际上,设置一切都需要吨的工作。任何一项工作都可能使用了堆栈,并在堆栈上留下了一些非零值。您不仅不能期望在不同的操作系统上具有相同的值,而且很可能突然改变您当前正在使用的系统。有兴趣的人士可以在Google上搜索“动态链接器”。
最后,C语言标准甚至没有术语堆栈。局部变量有一个“位置”留给编译器。它甚至可能从给定寄存器中发生的任何事情中得到随机的废话。实际上,任何都可以完全。实际上,如果触发了未定义的行为,则编译器可以自由执行任何感觉。