#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编译器。
答案 0 :(得分:1)
实际发生的事情是调用第一个printf覆盖了ptr指向的位置。
原因是你返回了一个指向变量的指针,然后该变量超出范围。
这是未定义的行为。
不要那样做。
答案 1 :(得分:0)
将*
运算符应用于不确定指针(指向任何位置)会调用未定义的行为。你可能得到任何东西。您可能获得26
因为在调用call
之后,26
存储在执行堆栈中。 *ptr
从堆栈中获取该值。