c编程中的悬空指针[重复]

Posted

技术标签:

【中文标题】c编程中的悬空指针[重复]【英文标题】:dangling pointer in c programming [duplicate] 【发布时间】:2014-01-28 18:50:51 【问题描述】:
#include <stdio.h>

int *call();


int main() 

    int *ptr, a = 5;
    ptr = call();

    printf("%d\n", a);
    printf("%d", *ptr);
    return 0;


int * call() 
    int x = 25;
    ++x;

    return &x;

上面的代码在打印a的值后输出垃圾值。 但是如果我删除 printf("%d\n",a);语句然后它输出 x 的值。 请解释... 根据悬空指针的概念,输出应该是垃圾值。 我正在使用 gcc 编译器。

【问题讨论】:

貌似x的值,其实是垃圾。 它总是打印 x 的值为 26...如果我删除 printf 语句(printf("%d\n",a);)。 重复:***.com/q/3127507/912144、***.com/q/19808553/912144、***.com/q/8743411/912144、***.com/q/4570366/912144、***.com/q/15903499/912144 和许多其他人。 【参考方案1】:

实际发生的是调用第一个 printf 覆盖了 ptr 指向的位置。

原因是你返回了一个指向变量的指针,然后超出了范围。

这是未定义的行为。

不要那样做。

【讨论】:

【参考方案2】:

* 运算符应用于不确定指针(指向任何地方)会调用未定义的行为。你可能会得到任何东西。您得到26 可能是因为在调用call 之后,26 存储在执行堆栈中。 *ptr 从堆栈中获取该值。

【讨论】:

@PascalCuoq;已编辑。

以上是关于c编程中的悬空指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的“悬空指针”和“野指针”是什么意思?

C vs 变量范围中的悬空指针问题

这是C ++中的未定义行为从悬空指针调用函数

通过从本地 C 样式数组返回指针来获取悬空指针

❤️野指针?悬空指针?❤️ 一文带你搞懂!

C++ 中的这种未定义行为是不是从悬空指针调用函数