NULL指针解引用出错

转自:点击打开链接

一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。只要对NULL指针解引用,程序就会崩溃

在C语言中对void *指针进行解引用会造成编译错误

在C语言的头文件stddef.h中,NULL的定义如下:
#define NULL
#define __cplusplus  //如果定义了__cplusplus表示是c++程序
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#interface NULL 0
所以,c语言里NULL的本质是(void *)0。

((void *)0)  本质上是将数字0强制转换为(void *)。0其实就是地址,(void *)只是说我们认为0这个地址中存储的类型是void *,也就是说0这个地址中存储的类型是void*,也就是当前不知道还未指定的.

例如 char i=2;这里的2本身这个数字就是表示地址,不能理解成2存在一个变量中,所以想通过char i=&2去取2的地址,这个是错误的。因为只有变量才有地址,2只是个数字是没有地址的。
因为这个数字我们要把它强制类型转化成指针,所以这个数字就是地址。

C语言中就通过类型来表示这个单元中存的什么玩意,譬如(int)0就表示0地址中存的是int型的数;譬如你(int *)0就表示0地址中存的是个地址,这个地址指向的单元是int型数

NULL只是一个概念,叫作空值,其值本身没有任何含义,可以用0代替,也可以用1,...代替,只要这些值不会与系统实际的有效地址冲突即可。 
因此,在此强调,不要自作聪明地认为NULL就是0,要判断的时候还是老老实实地与NULL做比较,别想当然地用什么!ptr之类的写法,因为在某个特定环境下,NULL可能不是0,而系
统函数返回的是NULL不是0时,你的函数就会出现莫名其妙的错误。所以,养成良好的习惯是非常重要的。
注意:

c语言中NULL表示内存位置0,NULL((void *)0)指针并不指向任何对象。因此除非是用于赋值或比较运算,出于其他任何目的使用NULL指针都是非法的。

在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它('\0')作为字符串的最后一个字符,以表示字符串到此结束.

第一:指针初始化(对应于上面的赋值)。

例如 int *x = NULL;

第二:函数返回是否成功判断(对应于做比较运算)。

当函数返回值为指针时,判断函数是否返回成功。举例如下:

FILE * pFile;
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) printf("open error");

第三:判断字符串是否为空字符串(对应于做比较运算)。

 

不管是字符串还是字符数组,安全起见,首先要判断指向该字符串或字符数组的指针是否为空,然后在判断首个字符是否为空。典型的做法如下:
char* s = "Blah-blah";
// ... other operations on s
if (s==NULL || s[0]=='\0') //写成if(s==NULL || strlen(s)<=0)会更好
   // ... 哦,空的





你可能感兴趣的:(c)