在c编程中悬空指针

时间:2014-01-28 18:50:52

标签: c

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

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

2 个答案:

答案 0 :(得分:1)

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

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

这是未定义的行为。

不要那样做。

答案 1 :(得分:0)

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