我在第0页找到了这段代码。 this Book作者的127说它打印42.但是当我尝试这个时它打印出一些垃圾值。为什么会这样?
#include <stdio.h>
void foo()
{
int a ;
printf("%d \n", a);
}
void bar()
{
int a = 42;
}
int main()
{
bar();
foo();
return 0;
}
答案 0 :(得分:5)
a
中的 foo()
未初始化,因此未定义行为。
然而,在实践中,一些编译器实际上输出42
(特别是如果关闭优化)。那是因为在调用bar()
之后,值42
将保留在堆栈中。在foo()
内,未初始化的a
获得了它。再次,它是未定义的行为,所以任何事情都可能发生,只是不要这样做。
答案 1 :(得分:1)
在foo()
中,变量a
未初始化。打印这样的变量是垃圾。函数bar()
完全没有意义 - 可能在编译期间从优化器中删除。
答案 2 :(得分:0)
函数foo是这个函数的局部变量,函数栏中也是一个局部变量,它与函数栏的无关
所以当你在函数栏中赋值时,foo函数没有变化,因为你在打印foo时看到了垃圾值
答案 3 :(得分:0)
bar()中定义的值仅在该函数持续时间的范围内。当在foo()中再次定义a时,编译器会重新分配a并且您无法保证内存存储的内容。你不能假设它会覆盖原始的a并指向42.
获取函数打印42的方法是在main()中定义一个,然后在bar()中设置a = 42并去除foo()中的重定义。
您确定没有复制出一个反例吗?或者你应该从现在开始怀疑地对待你的书。
答案 4 :(得分:0)
Yu Hao的答案解释了它最好的方法,我想修改你的代码使它(工作):
#include <stdio.h>
void foo(int a)
{
printf("%d \n", a);
}
void bar(int *a)
{
*a = 42;
}
int main()
{
int b;
bar(&b);
foo(b);
return 0;
}
答案 5 :(得分:0)
a的值在foo()函数中未初始化。 如果运行时内存中的堆栈是emty,那么它将打印垃圾值,否则打印第一个存在的值。 您可以将foo()转换为:
void foo()
{
int d ;
printf("%d \n", d);
int e ;
printf("%d \n", e);
}
第二行将打印垃圾值,例如124992。 因此,结果与运行时内存中的堆栈有关。