指针专题6-空指针NULL和void指针

 1 NULL指针

  一个指针变量可以指向计算机中任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给他,他就可以指向。C语言没有一种机制保证指向内存的正确性,程序员必须自己提高警惕。

  比如下面错误的例子,对没有初始化的指针进行操作,这是非常危险的。

char *str;
gets(str);
printf("%s",str);

  这段程序编译和链接不会报错,但当输入字符串按下回车,在Linux就会出现段错误(Segment Fault)。因为str是一个未初始化的局部变量,它的值不确定,指向的地址是随机的,很有可能指向一块没有被分配或者没有读写权限的内存,这时使用gets()函数给他写数据显然是错误的。

  我们的建议是对没有初始化的指针赋值为NULL。例如:

char *str=NULL;

   修改后,运行程序后直接打印出(null),由此猜测gets()和printf()对空指针做了判断。

 1.1 NULL指针解释

  NULL在C语言表示空指针。NULL是在stdio.h中定义的一个宏,也就是说NULL指向了地址为0的内存。

#define NULL ((void *)0)

  1.2 NULL指针用途

第一:指针的初始化

int *p=NULL;

第二:判断字符串是否是空字符串

char *Dprint(char *str)
{
  if(str=NULL)
    return 0;
 else
    printf("%s",str);
}    

第三:函数返回是否成功判断

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

2 void指针

  void用在函数定义中,表示函数没有返回值或者没有形参,而void用在void *中表示指针指向的数据类型是未知的。也就是说,void *表示的是一个有效指针,它确实指向实实在在的数据,只是数据的类型尚未确定,在后面的使用过程中要进行强制类型转换。

int main(){
  char *str = (char *)malloc(sizeof(char) * 30);  //malloc返回值是void *类型,在使用时要进行强制类型转换
  gets(str);
  printf("%s
", str);
  return 0;         
}
原文地址:https://www.cnblogs.com/Mike2019/p/11813833.html