我有一个未初始化的int指针。打印时,它总是显示为0。
但是当对NULL检查时,它不会传递条件。
有趣的是,这个狂野指针在没有抛出Segmentation Fault的情况下获取值。
任何解释??
以下代码:
int main (){
int *p1;
int *p2;
int var=90;
printf("p1 = %x\n", p1);
printf("p2 = %x\n", p2);
p1 = &var;
if(p2==NULL)
{return 0;}
*p2 = *p1;
printf("*p2 = %x\n", *p2);
}
输出看起来像这样..
# gcc -std=c99 -o main *.c
# main
p1 = 0
p2 = 0
*p2 = 90
答案 0 :(得分:5)
有几点:
%p
打印void *
指针。0
,尽管它通常在现代机器中。总而言之,像这样探索UB并不能证明什么。
答案 1 :(得分:0)
(注意:您需要#include <stdio.h>
来编译代码。)
这是一个可能的解释:
p2
的值是不确定。使用不确定的值会导致未定义的行为,即使它只是NULL
检查。从这一点开始,比较运算符或代码的任何其他部分都不需要特定的行为。
因此,p2
的不确定值不必等于NULL
,即使事实证明p2
打印出来时NULL
。编译器可以自由地从编译代码中删除测试。