C指针异常问题咨询:为何两段相似代码输出结果不同?
为什么第一段C代码输出异常,第二段却正常?
这是个非常典型的C指针新手坑——未初始化指针导致的未定义行为,咱们拆解来看问题出在哪:
第一段代码的错误分析
先看你的第一段代码:
#include <stdio.h> int main() { int a, *ptr; a=10; *ptr=&a; // 这里是核心错误! printf("%d",*ptr); return 0; }
这里有两个致命问题:
- 指针未初始化:
ptr是一个指针变量,但声明后没有被赋值,它的初始值是内存里的随机垃圾值,指向的是一块完全未知的内存区域。 - 操作逻辑完全错误:
*ptr是「解引用指针」,意思是访问ptr指向的内存空间;而&a是变量a的内存地址(属于指针类型的值)。你试图把一个地址赋值给*ptr(一个int类型的内存空间),不仅类型不匹配,还会往随机的未知内存写入数据——这就是C语言里的「未定义行为」,程序可能崩溃、输出随机数(比如你看到的634927948),甚至做其他奇怪的事,完全不可预测。
第二段代码为什么正确
再看第二段代码:
#include <stdio.h> int main() { int a=10; int *ptr=&a; // 正确初始化指针 printf("%d",*ptr); return 0; }
这里的关键是直接给指针变量ptr赋值:ptr=&a的意思是把变量a的内存地址存到ptr里,让ptr明确指向a的内存空间。之后解引用*ptr,就是直接读取a的值10,所以输出完全正确。
修正第一段代码的方法
如果想让第一段代码正常工作,只需要把错误的*ptr=&a;改成ptr=&a;——也就是给指针变量本身赋值,而不是解引用后赋值:
#include <stdio.h> int main() { int a, *ptr; a=10; ptr=&a; // 修正:给指针变量赋值,让它指向a printf("%d",*ptr); return 0; }
这样运行后就会输出正确的10了。
内容的提问来源于stack exchange,提问作者QTREE
相关产品推荐
相关产品推荐

