将十进制零分配给C指针

时间:2016-11-14 07:58:37

标签: c pointers null-pointer

//line 2 causes the program to terminate
#include <stdio.h>
int main()
{   
 int *qi = 0;  //1 -- making qi a null pointer
 if(qi==NULL) printf("Null\n");
 else printf("Not Null\n"); 
 *qi =0; // 2  ---  assigning *qi a decimal zero value.
 return 0;
}
上面代码中的

注释2终止了程序,而添加了一行

qi =  &zero;

在上面的代码中,在注释号2之前阻止了这一点,如下所示

// this code works fine
#include <stdio.h>
int main()
{
 int *qi = 0;  //1
 if(qi==NULL) printf("Null\n");
 else printf("Not Null\n"); 
 int zero =0;
 qi = &zero;
 *qi= zero;  //2
 printf("%d\n",*qi);
 return 0;
}

为什么会这样?解释好像你正在向孩子解释。

2 个答案:

答案 0 :(得分:1)

很简单......整数指针指向由整数分配的内存块。空指针没有要指向的内存。所以* qi = 0;你正在重新定义一个实际上不存在的空位置。在第二种情况下,将整数指针指向一个整数变量零,这样就可以了。

答案 1 :(得分:1)

int *qi = 0;

qi是一个空指针。你不能用空指针做很多事情。特别是,你不能取消引用它来读或写:

*qi = 0; // WRONG - illegal use of a null pointer.

现在,我们执行

qi = &zero;

qi不再是空指针,因为我们在其中存储了zero的地址。 qi 指向 zero

*qi = zero; // RIGHT (but pointless)

这会将zero中存储的值复制到qi指向的位置。我们知道qi指向zero,因此现在与编写

相同
zero = zero;