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编程中的悬空指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章