请查看以下代码段:
void abc(void)
{
int a;
printf("%d\n", a);
}
void xyz(void)
{
int a = 44;
}
int main(void)
{
xyz();
abc();
}
当我编译并运行程序时,它显示值为44.我希望它显示一些其他垃圾值。如果我使用优化,结果是预期的。有人可以帮助我理解确切的问题吗?
由于
答案 0 :(得分:0)
void abc(void)
{
int a;
printf("%d\n", a);
}
您正在使用a
未初始化,这是未定义的行为。这意味着任何事情都可能发生,包括(但不保证)a
中abc()
分配的内存仍保留一些先前的值(即{{1}期间分配的值) })。
另一个线程可能会损坏该内存。从xyz()
返回时,它可能已被清零。系统可能正在运行一种“忘记”未使用内存的RAM,用随机噪声替换先前的值。 不要触摸未定义的行为。
如果将两个变量中的一个重命名为xyz()
以外的其他变量,可能会有点混乱。他们有相同的名称在这里没有影响;它们是在相应函数中声明的第一个a
,其中 - 在您的特定体系结构上 - 导致它们占用相同的内存地址。 这是巧合,而不是语言保证。即,未定义即将发生。