在C范围内使用自动变量

时间:2016-04-07 08:03:17

标签: c

我正在研究自动变量的工作。我知道它只能在声明它的块或函数内部访问,并且它的生命周期在同一个函数或块中。所以我要检查以下代码。

/ 标头文件声明 /

void testfn(void);
int   *p;
int main(void)
{
  testfn();
  print("%d\n",*p);
  return 0;
}

void testfn(void)
{
  int x=444;
  p=&x;
}

输出为 - 444

我想知道当testfn();退出,变量x将被销毁。那么在main函数中指针(* p)如何打印444。 这是如何工作的......或者如果我遗漏了什么。 请澄清我的疑问。

由于

4 个答案:

答案 0 :(得分:1)

以前为变量x保留的内存位置尚未覆盖。但它可能在任何时候。这就是您的代码导致未定义行为的原因。

在以下示例中,先前为变量x保留的内存位置将被分配给变量y的值覆盖。由于指针p仍指向该位置,因此*p将评估此新值:

#include <stdio.h>

int *p;

void test1(void) {
    int x = 444;
    p = &x;
}

void test2() {
    int y = 15;
}

int main(void) {
    test1();
    test2();
    printf("%d\n",*p);
    return 0;
}

答案 1 :(得分:0)

原始价值仍然存在,这是巧合。使用其他编译器或其他编译配置,它可能需要任何其他值,否则程序可能会崩溃。

如果在testfnprintf函数之间调用任何其他函数对其局部变量执行某些操作,则可能会看到不再获取444值。但这又是巧合。

答案 2 :(得分:0)

x指向存储444的堆栈。如果内存位置尚未用于其他内容,则很可能会获得p

尝试在打印#include <stdio.h> #include <math.h> void foo() { int y=123; } void testfn(void); int *p; int main(void) { testfn(); foo(); printf("%d\n",*p); return 0; } void testfn(void) { int x=444; p=&x; } 之前插入另一个函数调用,看看会发生什么:

123

在我的机器上,输出现在是:

$row

由于代码导致未定义的行为,如果我在另一个平台上尝试此操作,结果可能会有所不同。但是你可以看到未定义的行为可能导致奇怪的错误。

答案 3 :(得分:0)

值仍然存在的事实完全是巧合(不保证),因为还没有覆盖它。

你不能指望它,它可能会失败,可能会打印垃圾或甚至可能导致您的程序或PC崩溃。

不要使用它,它被认为是未定义的行为。