【问题标题】:Global pointer and dangling pointer [duplicate]全局指针和悬空指针[重复]
【发布时间】:2020-02-25 11:35:02
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
int *p;
void f()
{
    int a=5;
    p=&a;
    printf("%d ",*p);
}
void main()
{
    f();
    printf("%d",*p);
}

为什么 O/P 是 5 5? 函数调用结束后,局部变量 a 被删除。所以 p 应该指向无效对象

【问题讨论】:

  • 因为未定义的行为不能保证出错。发生的事情是不确定的,但它发生了。如果您在 f();printf("%d",*p); 之间插入另一个函数调用,您可能会得到不同的结果。
  • 从函数返回后,C不浪费时间初始化本地数据;它就这样离开了。但请记住;当函数在作用域内时,它的数据(属于函数的内存空间)受到保护,不会被覆盖。然而,当代码指针到达函数的return 行时,所有内存空间都保持原样,但很容易被覆盖(不再受保护)。从函数返回后,main 可能会也可能不会打印5,这取决于本地内存是否被覆盖。
  • @aditi19 如果您不理解my answer 的某个短语,请告诉我以改进它。
  • 明白...谢谢

标签: c pointers dangling-pointer


【解决方案1】:

如果它是未定义的行为,那么它也被允许(偶尔)给出 5 的输出。但如果第二天早上它给出 6,请不要感到惊讶。

【讨论】:

    【解决方案2】:

    为什么输出 5 是 5?

    这是因为一个叫做“Undefined Behavior”的东西。未定义的行为不必总是提供错误的结果。

    函数调用结束后,局部变量a 被删除。所以p 应该指向无效对象。

    确切地说,它指向一个 invalid 对象,或者说根本没有对象——分配在函数 f() 内部的 int 对象 a 已经在在main() 中执行printf("%d",*p); 的点。

    要取消引用具有存储地址的指针,指向不再存在的对象是Undefined Behavior

    它可以打印出任何东西。它打印出5 只是一个幸运的机会,但绝不可靠。即使第二次执行完全相同的文件,您已经可以得到不同的结果。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多