自动变量保留函数调用的值

时间:2016-03-29 13:33:22

标签: c

请查看以下代码段:

void abc(void)
{
    int a;
    printf("%d\n", a);
}

void xyz(void)
{
    int a = 44;
}

int main(void)
{
    xyz();
    abc();
}

当我编译并运行程序时,它显示值为44.我希望它显示一些其他垃圾值。如果我使用优化,结果是预期的。有人可以帮助我理解确切的问题吗?

由于

1 个答案:

答案 0 :(得分:0)

void abc(void)
{
    int a;
    printf("%d\n", a);
}

您正在使用a未初始化,这是未定义的行为。这意味着任何事情都可能发生,包括(但不保证aabc()分配的内存仍保留一些先前的值(即{{1}期间分配的值) })。

另一个线程可能会损坏该内存。从xyz()返回时,它可能已被清零。系统可能正在运行一种“忘记”未使用内存的RAM,用随机噪声替换先前的值。 不要触摸未定义的行为

如果将两个变量中的一个重命名为xyz()以外的其他变量,可能会有点混乱。他们有相同的名称在这里没有影响;它们是在相应函数中声明的第一个a,其中 - 在您的特定体系结构上 - 导致它们占用相同的内存地址。 这是巧合,而不是语言保证。即,未定义即将发生。