C语言中自动变量在其作用域之外的使用

C语言中自动变量在其作用域之外的使用,c,C,我正在研究自动变量的工作原理。我知道它只能在声明它的块或函数内访问,并且它的生存期在同一个函数或块内。下面是我要检查的代码 /头文件的声明/ 输出为-444 我想知道当testfn()时;退出时,变量x将被销毁。然后在主函数中指针(*p)如何打印444。 这是如何工作的…或者如果我遗漏了什么。 请澄清我的疑问 谢谢之前为变量x保留的内存位置尚未被覆盖。但它可能在任何时候。这就是代码导致未定义行为的原因 在以下示例中,先前为变量x保留的内存位置将被分配给变量y的值覆盖。由于指针p仍然指向该位置,*

我正在研究自动变量的工作原理。我知道它只能在声明它的块或函数内访问,并且它的生存期在同一个函数或块内。下面是我要检查的代码

/头文件的声明/

输出为-444

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


谢谢

之前为变量
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;
}
#包括
int*p;
无效测试1(无效){
int x=444;
p=&x;
}
void test2(){
int y=15;
}
内部主(空){
test1();
test2();
printf(“%d\n”,*p);
返回0;
}

原来的值仍然保留,这是巧合。如果使用另一个编译器,或者使用另一个编译配置,它可能会接受任何其他值,或者程序可能会崩溃


如果在
testfn
printf
函数之间调用任何其他对其局部变量执行操作的函数,则可能会发现不再获得444值。但这又是巧合。

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;
}

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

值仍然保留的事实完全是巧合(不保证),因为还没有任何内容覆盖它

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


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

未定义的行为……这就是未定义行为的问题:它可能看起来像预期的行为,而实际上它不是。不幸的是,这是一个未定义、未定义的错误行为。地址的值与函数激活时的值相同,但它指向的内存不再分配给该函数。但这完全是浪费时间。我知道你在努力学习,但这不是你应该在这里发布的东西。
#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