另一个函数中使用的一个函数中局部变量的值(c编程)

时间:2013-10-23 18:25:26

标签: c local-variables activation-record

#include<stdio.h>

void bar()
{
 int a=4;
}
void foo()
{
 int a;
 printf("%d",a);
}
int main()
{
 bar();
 foo(); 
}

我确信上面的程序将输出作为一些垃圾值(这就是我编译和运行时发生的事情)。但我在一篇文章中读到,有些编译器可能会将输出本身作为4。给出的解释是它与激活堆栈和激活帧有关。我不明白它是否类似于int()函数的int a = 4的值存储在激活堆栈的某个地方以备将来使用?我很困惑!!

4 个答案:

答案 0 :(得分:3)

不要担心某些编译器可能会做什么。它被称为“未定义的行为”。始终确保将变量初始化为您想要的变量。

再说一次,尝试“理解”是没有意义的,因为没有逻辑,而且肯定不是“预期的行为”。但是,可以想象,如果函数内联,某些编译器会在cpu上重用一个寄存器,所以是的,它可能会发生。如果你担心有人在你之后运行一个函数并“窃取你的价值”,那么在退出你的函数之前将其设置为零。但这不是“最佳实践”。

换句话说,即使第二个函数使用'b'而不是a,如果它们重用内存空间,它也可能有4个。或者其他一些编译器实际上可能按字母顺序预分配,因此只有'a'才有效。同样,它是未定义的行为。

答案 1 :(得分:1)

函数foo使用未初始化的变量。在这种情况下,编译器可以自由地做它喜欢的事情。在实践中,您可能会获得一个先前放在堆栈中的变量,该变量现在已经不存在了。正如你所说,它可能是4,但它可能是其他任何东西。永远不要依赖这种行为......它可能99%可靠,但在第100次尝试时出错了。

答案 2 :(得分:1)

要明确的是,foo的a最终可能会在那里设置4个条形图(与它们具有相同名称BTW没有任何关系)。但这高度依赖于编译器机器等。

你实际在做什么(在foo中)是'未定义的行为',你使用a而不给它一个值。未定义意味着编译器可以执行任何操作,格式化硬盘,打印任何随机值,包括您最好的朋友生日,或者它可以打印4。

为什么它可能是4,因为在许多系统上构建堆栈帧的方式将导致条形码4写入地址并且foo将其读回。这两个函数具有相同的参数,返回类型和本地数量,因此第一个本地可能会分配在同一个内存位置。这就是为什么你读到他们可以有相同的价值,但这不是设计

顺便说一句BTW你得到4分,不是

答案 3 :(得分:0)

尽管两个变量具有相同的名称,但它们存储在不同的地址中,而由编译器初始化的第二个a可能还有另一个值。

这里看起来像a,但是一旦编译,这两个局部变量就不同了,不能相同。