【发布时间】:2020-05-28 22:35:28
【问题描述】:
因此,函数“thinkOfANumber”为变量“x”赋予值 108。然后,我们进入函数“mindReading”,该函数具有未赋予任何值的变量“secrets”。但不知何故,它得到了与“x”相同的值。我的猜测是它与堆栈和内存有关。谁能帮我解释一下?
代码:
void thinkOfANumber(){
int x = 108;
printf( "This function thinks of a secret number (%d)\n", x);
}
void mindReading(){
int secret;
printf( "This function believes that the other functions secret is: %d!\n", secret); //Prints 108
}
void main(){
thinkOfANumber();
mindReading();
return 0;
}
【问题讨论】:
-
Undefined behaviour 以神秘的方式工作,使用未初始化的变量是 UB..
-
旁注:
return 0;在void main()函数中看起来很奇怪。我建议更改返回类型,因为main必须返回int。 C++ 标准是这么说的。 -
尝试在启用优化的情况下编译此代码。这足以打破它,请参阅:wandbox.org/permlink/abDKQVpFjjMxbnnK
-
这绝对是未定义的行为。但它恰好起作用,因为
secret很可能与x共享相同的堆栈地址。但是使用-O3优化进行编译,一切都会消失。 -
我曾经遇到过这样的事情,通过在源代码中添加或删除 cmets 来改变行为。未定义的行为可以做任何事情,包括时间旅行(参见stackoverflow.com/questions/24527401/…)
标签: c++