繁体   English   中英

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

[英]what is the output of this code in C?

我在页码中找到了此代码。 这本书的作者127说它打印42。但是当我尝试这样做时,它打印一些垃圾值。 为什么会这样呢?

    #include <stdio.h>
    void foo()
    {
        int a ;
        printf("%d \n", a);
    }

    void bar()
    {
        int a = 42;
    }

    int main()
    {
        bar();
        foo();
        return 0;
    }

afoo()未初始化,所以这是不确定的行为。

但是,实际上,某些编译器实际上会输出42 (尤其是在优化关闭的情况下)。 这是因为在调用bar() ,值42留在了堆栈中。 foo()内部,未初始化的a会得到它。 同样,这是未定义的行为,因此任何事情都可能发生,只是不要这样做。

foo() ,变量a未初始化。 打印这样的变量是垃圾。 函数bar()完全没有意义-可能会在编译时从优化器中删除。

in函数foo是此函数的局部变量,in函数条也是局部变量,与函数条的a无关

因此,当您为in功能栏分配值时,foo函数的a不会发生任何变化,因为当您打印in in foo时会看到垃圾值

在bar()中定义的值仅在该函数期间有效。 当在foo()中再次定义a时,编译器将重新分配a,您将无法保证内存存储了什么。 您不能假定它将覆盖原始a并指向42。

获取函数以打印42的方法是在main()中定义a,然后在bar()中设置a = 42并摆脱foo()中的重新定义。

确定您没有复制反例吗? 从那以后,或者您应该怀疑自己的书。

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;
}

a的值在foo()函数中未初始化。 如果运行时内存中的堆堆栈为emty,则它将打印垃圾值,否则将打印第一个存在的值。 您可以将foo()转换为:

void foo()
{
    int d ;
    printf("%d \n", d);

    int e ;
    printf("%d \n", e);
}

第二行将打印垃圾值,例如124992。因此结果与运行时内存中的堆堆栈有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM