gpt4 book ai didi

c++ - C++ 中未初始化的变量行为

转载 作者:可可西里 更新时间:2023-11-01 14:55:28 24 4
gpt4 key购买 nike

我自己查了一下,我写了一个这样的程序

int main() {
int i;
cout << i;
return 0;
}

我运行了程序几次,结果一直都是一样的,都是零。我在 C 中试过,结果是一样的。

但是我的教科书上说

If you don’t initialize an variable that’s defined inside a function, the variable value remain undefined.That means the element takes on whatever value previously resided at that location in memory.

当程序总是为变量分配空闲内存位置时,这怎么可能?它怎么可能不是零(我假设默认可用内存值为零)?

最佳答案

How's this possible when the program always assign a free memory location to a variable? How could it be something rather than zero?

让我们来看一个实际实现的例子。

假设它利用堆栈来保存局部变量。

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 值。

现在应该清楚局部变量初始化是必需的。但是 ma​​in 可以异常(exception)吗?有没有什么东西可以与堆栈一起玩,结果给我们一个非零值?

是的。 ma​​in 不是您程序中执行的第一个函数。事实上,设置所有内容需要大量的工作。任何这项工作都可能使用堆栈并在其上留下一些非零值。您不仅不能期望在不同的操作系统上有相同的值,而且它很可能会在您现在使用的系统上突然发生变化。有兴趣的可以google一下“动态链接器”。

最后,C语言标准连栈这个词都没有。局部变量的“位置”留给编译器。它甚至可以从给定寄存器中发生的任何事情中随机获取垃圾。它真的可以完全是任何东西。事实上,如果未定义的行为被触发,编译器可以自由地做任何它想做的事。

关于c++ - C++ 中未初始化的变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com