zoukankan      html  css  js  c++  java
  • C中空指针、NULL与0

    空指针是指确保可以没有指向任何一个对象的指针。空指针常量值通常使用宏定义NULL来表示。

    空指针和任何非空指针比较都不相等,因此经常作为函数异常时的返回值使用。

    链表也经常在数据末尾放一个空指针提示后续没有数据。

    那么NULL是什么呢?

    通常情况下,NULL就是0.

    例如有些代码里会把NULL宏定义成这样:

    #define NULL 0

    但是0与NULL不是完全等价的。

    例如字符串使用’’结束,但是如果使用NULL结束字符串,应该认为这是错误的。

    既然“指针就是地址”,那么空指针是不是就是为0的地址呢?大多数情况下这是正确的,但是由于硬件的原因,也可能存在值不为0的空指针。

    这时是不是应该把NULL宏定义为其他的值呢?

    这样的想法是有偏差的,这涉及到问题的内部根源。

    比如

    int *p = 3;

    这样的代码是有编译警告的,因为指针类型和int类型毕竟是不一样的;

    但是

    int *p = 0;

    反倒没有问题。

    这是因为在C中,“当常量0处于应该作为指针使用的上下文中时,它就作为空指针使用”。

    推荐的宏定义方法是:

    #define NULL ((*void)0)

    显式声明的目的是,防止编译器理解不了“根据上下文将0作为指针处理”以提高可移植性,比如以下场景:

    . 没有原型声明的函数的参数

    . 可变长参数函数中的可变部分的参数

    在ANSI C中,因为引入了原型声明,只有在确实做了原型声明的情况下,编译器才知道你“想要传递指针”。

  • 相关阅读:
    nginx日志模块及日志定时切割
    Nginx学习笔记
    Nginx负载均衡和反向代理
    python--inspect模块
    Python--sys
    Docker 中 MySQL 数据的导入导出
    分布式监控-open-falcon
    《转载》脚本实现从客户端服务端HTTP请求快速分析
    《转载》日志大了,怎么办?用我的日志切割脚本吧!
    《MySQL》一次MySQL慢查询导致的故障
  • 原文地址:https://www.cnblogs.com/freshair_cnblog/p/11654379.html
Copyright © 2011-2022 走看看