C中此代码的输出是什么?

时间:2014-08-25 07:41:09

标签: c stack

我在第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;
    }

6 个答案:

答案 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。 因此,结果与运行时内存中的堆栈有关。