int main() {
int i;
cout << i;
return 0;
}
我运行了几次这个程序,结果每次都是一样的——零。 我已经尝试了在C语言中运行,结果也是一样的。
但是我的教材上说:
如果你未初始化函数内定义的变量,那么变量值将保持未定义。这意味着元素将取代先前在该内存位置驻留的任何值。
当程序总是分配一个空闲内存位置给变量时,这怎么可能发生呢?它怎么可能不是零(我假设默认空闲内存值为零)?
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的值不能依赖于初始化。
现在应该清楚了,需要对局部变量进行初始化。但是,main是否可以例外呢?有没有什么东西可以玩弄堆栈,并给我们一个非零值呢?
是的。main不是程序中第一个执行的函数。事实上,需要进行大量的工作来设置一切。其中任何工作都可能使用堆栈并在其上留下一些非零值。不仅您不能期望在不同操作系统上获得相同的值,而且它甚至可能在您正在使用的系统上突然更改。感兴趣的人可以搜索“动态链接器”。
最后,C语言标准甚至没有堆栈这个术语。留下为本地变量“分配空间”的任务交给了编译器。它甚至可以从一个给定的寄存器中随意获取任何东西。实际上,如果触发未定义行为,编译器有自由做任何它想做的事情。
-Wall
时,编译器应该发出警告。warning: 'i' is used uninitialized in this function [-Wuninitialized]
cout << i;
^
恰巧,在您的系统上执行时,它的值为0。这意味着变量分配的垃圾值恰好是0,因为内存中的剩余部分表明如此。
然而,请注意,内核零经常出现。这意味着我可以经常在系统输出中得到零,但不能保证,并且不应该作为承诺。
int
的程序,标准允许该整个程序产生任何可观察的行为。 - Caleth静态变量和全局变量都被初始化为零:
Global:
int a; //a is initialized as 0
void myfunc(){
static int x; // x is also initialized as 0
printf("%d", x);}
非静态变量或自动变量,即局部变量是不确定的(通常指它可以做任何事情。它可以是零,也可以是其中的值,还可以导致程序崩溃)。在分配值之前读取它们会导致未定义的行为。
void myfunc2(){
int x; // value of x is assigned by compiler it can even be 0
printf("%d", x);}
这主要取决于编译器,但通常情况下大多数编译器都会将其预设为0。
cout
是C++中的。 - Shafik Yaghmourcout
的呢? - Deanie