zoukankan      html  css  js  c++  java
  • 指针专题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;         
    }
  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/Mike2019/p/11813833.html
Copyright © 2011-2022 走看看