为什么我不能得到0,1,2作为输出?

Pau*_*nta 1 c stack

我做了一个小测试,看看如何在C应用程序中使用堆栈.

#include <stdio.h>

void a(void)
{
    int a = 0;
}

void b(void)
{
    int b;
    printf("%i\n", b++);
}

int main(void)
{
    a();
    b();
    b();
    b();
    fflush(stdin), getc(stdin);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是不是b在堆栈的同一个地方分配了a?我希望输出是0 1 2,但我得到相同的垃圾值三次.这是为什么?

Jer*_*fin 10

关于为什么得到你正在获得的东西获得明确答案的唯一方法是从编译器获取汇编语言输出并查看它正在做什么.猜测,整个a()被删除作为死代码,并且b可能被分配到寄存器中,所以即使a已经分配和初始化,仍然有一个公平的机会b不会在同一个存储器中结束.

从语言的角度来看,实际上没有任何答案 - 您的代码只是使用未初始化的变量而具有未定义的行为.只是为了增加对伤害的侮辱,你fflush(stdin)也会导致未定义的行为,所以即使代码的其余部分有意义,你仍然无法保证它会产生什么输出.

  • 我不认为使用单元化变量本身就是UB,只有当碰巧在那里的垃圾值存在底层类型的陷阱表示时. (2认同)
  • @JensGustedt:委员会不同意.请参阅[缺陷报告#109](http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_109.html):"使用不确定值的对象会导致未定义的行为." (2认同)