未初始化指针行为差异:为何打印地址后仍存非法访问问题?
未初始化指针的常见陷阱
咱们得先搞清楚一个容易混淆的点:指针变量本身的内存地址是系统自动分配的,但指针指向的目标内存是完全未初始化的,里面全是垃圾数据。如果直接解引用这种未初始化的指针,轻则读取无效数据,重则触发程序崩溃或者未定义行为。
先看第一个典型错误示例:
int *pi; printf("%i\n",*pi);
这段代码直接解引用了未初始化的pi,编译器会直接抛出错误:
error: ‘pi’ is used uninitialized in this function
那有人可能会好奇,如果先打印指针自己的地址呢?比如下面这段代码:
int *pi; printf("%p\n",&pi); //打印指针变量自身的地址 printf("%i\n",*pi);
运行后你会发现,第一个printf确实能输出一个看起来合法的虚拟地址(比如0x7ffeea9313c8),但这只是指针变量自己在栈上的地址而已,它指向的内存区域依然是未初始化的垃圾数据,第二个printf解引用时还是在访问无效的内存内容,本质上还是未定义行为,只是编译器可能没直接报错而已。
内容的提问来源于stack exchange,提问作者SLN
相关产品推荐
相关产品推荐

