This question already has answers here:
Can a local variable's memory be accessed outside its scope?
(20个答案)
3年前关闭。
查看以下代码段:
当我编译并运行该程序时,它显示值为44。我希望它显示其他一些垃圾值。如果我使用优化,则结果是预期的。有人可以帮助我了解确切的问题吗?
谢谢
您正在使用未初始化的
一个不同的线程可能会破坏该内存。从
如果将两个变量之一重命名为
(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/