【问题标题】:Use of automatic variable outside its scope in C [duplicate]在C中使用超出其范围的自动变量[重复]
【发布时间】:2016-07-27 23:31:30
【问题描述】:

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

/头文件的声明/

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。 这是如何工作的......或者如果我错过了什么。 请澄清我的疑问。

谢谢

【问题讨论】:

  • 未定义的行为...
  • 这就是未定义行为的原因:它可能看起来像预期的行为,但实际上并非如此。不幸的是,这是未定义的,未定义的错误行为。
  • 地址与函数激活时的值相同,但它指向的内存不再分配给该函数。但这完全是浪费时间。我知道您正在努力学习,但这不是您应该在此处发布的内容。

标签: c


【解决方案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;
}

【讨论】:

    【解决方案2】:

    巧合的是,原来的价值仍然存在。如果使用另一个编译器,或者使用另一个编译配置,它可能会采用任何其他值,否则程序可能会崩溃。

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

    【讨论】:

      【解决方案3】:

      p 指向存储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
      

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

      【讨论】:

        【解决方案4】:

        该值仍然存在的事实完全是巧合(不能保证),因为尚未覆盖它。

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

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

        【讨论】:

          猜你喜欢
          • 2020-06-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 2016-04-30
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          相关资源
          最近更新 更多