• 指针专题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;         
    }
  • 相关阅读:
    缓存一致性问题
    缓存雪崩
    mysql Replication机制
    数据库水平切分、拆库拆表
    mysql分表和分区实际应用简介
    mysql中间件
    mysql基础知识
    go语言redis使用(redigo)
    nginx location配置与rewrite配置
    PDO驱动使用
  • 原文地址:https://www.cnblogs.com/Mike2019/p/11813833.html
Copyright © 2020-2023  润新知