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

标签 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。给出的解释是,它与激活堆栈和激活帧有关。我不明白。是不是像 bar() 函数中的 int a=4 的值存储在激活堆栈中的某个位置以供将来使用?我很困惑!

最佳答案

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

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

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

关于c - 一个函数中的局部变量的值在另一个函数中使用(C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19549528/

相关文章:

java - 尝试从单独的方法增加局部变量但不起作用。关于激活堆栈/记录的混淆

c - 在 C 语言的编译时评估的预处理器函数

c - 在结构中将 const char 转换为 char 时出错?

c - 为什么正则表达式总是返回 1?

c# - 使用未分配的局部变量 `total`

c++ - main()是用一个自动变量创建的,如果是,它的用途是什么?

c - OpenGL glReadPixels 到 FreeImage 位图

python - 从 multiprocessing.Process 继承的 Python 类的设置值问题

java - 在 lambda 主体中实例化变量

java - 这段代码中的变量 'x' 会存储在堆栈内存、堆内存还是两者中?