未初始化的指针vs NULL和0

时间:2014-12-03 09:48:49

标签: 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);

}

输出看起来像这样..

# gcc -std=c99 -o main *.c
# main
p1 = 0
p2 = 0
*p2 = 90

2 个答案:

答案 0 :(得分:5)

有几点:

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

答案 1 :(得分:0)

(注意:您需要#include <stdio.h>来编译代码。)

这是一个可能的解释:

p2的值是不确定。使用不确定的值会导致未定义的行为,即使它只是NULL检查。从这一点开始,比较运算符或代码的任何其他部分都不需要特定的行为。

因此,p2的不确定值不必等于NULL,即使事实证明p2 打印出来时NULL。编译器可以自由地从编译代码中删除测试。