未初始化的指针vs NULL和0

Sur*_*rya -1 c pointers initialization

我有一个未初始化的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);

}
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样..

# gcc -std=c99 -o main *.c
# main
p1 = 0
p2 = 0
*p2 = 90
Run Code Online (Sandbox Code Playgroud)

Yu *_*Hao 5

几点:

  1. 使用%p打印void *指针.
  2. 空指针的内部值不一定0,尽管它通常在现代机器中.
  3. 取消引用未初始化的指针是未定义的行为,任何事情都可能发生.特别是,它并不意味着总是会发生分段错误.

总而言之,像这样探索UB并不能证明什么.