将十进制零赋值给C指针

将十进制零赋值给C指针,c,pointers,null-pointer,C,Pointers,Null Pointer,在上面的代码中,注释2之前阻止了这种情况,如下所示 qi = &zero; //此代码工作正常 #包括 int main() { int*qi=0;//1 如果(qi==NULL)printf(“NULL\n”); else printf(“非空\n”); int零=0; qi=&0; *qi=0;//2 printf(“%d\n”,*qi); 返回0; } 为什么会这样?像向孩子解释一样解释 很简单。。。整数指针指向由整数分配的内存块。空指针没有指向该点的内存。因此,通过*qi=

在上面的代码中,注释2之前阻止了这种情况,如下所示

qi =  &zero;
//此代码工作正常
#包括
int main()
{
int*qi=0;//1
如果(qi==NULL)printf(“NULL\n”);
else printf(“非空\n”);
int零=0;
qi=&0;
*qi=0;//2
printf(“%d\n”,*qi);
返回0;
}

为什么会这样?像向孩子解释一样解释

很简单。。。整数指针指向由整数分配的内存块。空指针没有指向该点的内存。因此,通过*qi=0;您正在取消引用一个实际不存在的空位置。在第二种情况下,将整数指针指向整数变量零,这样就可以了

// 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;
}
qi
是空指针。使用空指针不能做很多事情。特别是,您不能将其解引用以进行读或写:

int *qi = 0;
现在,我们执行

*qi = 0; // WRONG - illegal use of a null pointer.
qi
不再是空指针,因为我们在其中存储了
zero
的地址
qi
指向

qi = &zero;
这会将存储在
zero
中的值复制到
qi
指向的位置。我们知道,
qi
指向
zero
,所以现在这与编写相同

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

如果不在内存地址0处正确分配
sizeof int
字节块,语句
*qi=0
(前面加
qi=0
)将产生未定义的行为。使用
qi=&zero
,您将
qi
设置为指向正确分配的
sizeof int
字节块,这允许您安全地执行
*qi=0
。类型不分配任何内容。在C语言中,定义访问类型的不是对象,而是用来访问它的类型(在许多情况下,使用不同的类型会调用未定义的行为)。
*qi = zero; // RIGHT (but pointless)
zero = zero;