This question already has answers here:
Can a local variable's memory be accessed outside its scope?
                                
                                    (20个答案)
                                
                        
                                3年前关闭。
            
                    
查看以下代码段:

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

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

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


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

谢谢

最佳答案

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


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

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

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

关于c - 自动变量在函数调用之间保留值。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36285885/

10-11 22:44
查看更多