c语言中NULL到底是什么?

C语言中NULL到底是什么?

1.NULL在C/C++中定义为:
#ifdef _cplusplus // 定义这个符号就表示当前是C++环境
#define NULL 0 // 在C++中NULL就是0
#else
#define NULL (void *)0 // 在C中NULL是强制类型转换为void *的0
#endif
2.由上可知,在C和C++中NULL是略有差异的,在C++中NULL就是数字0,在C中NULL是个指针变量,指向地址0。在C语言中,int *p;你可以p = (int *)0;但是不可以p = 0;因为类型不相同。

NULL有什么作用?

1.C语言的精髓是指针,指针是可以指向内存地址,程序员可以直接读写内存,好处是效率高,坏处是如果访问的内存是不该访问的内存地址,就会造成段错误或者非法修改数据导致程序运行异常。所以在C语言中,对指针变量的引用要谨慎。
2.当我们定义一个局部指针变量时,因为临时变量都是从栈申请的,变量的初值都是随机的,导致刚申请的指针变量指向的内存地址是不可预知的。至于为什么临时变量申请的初值是随机的,可以参考另一篇博客
《C语言与堆栈的理解》。如果我们定义了一个变量而没有去初始化,直接解引用,会导致段错误或者修改了不该访问的内存地址处的数据。导致段错误已经是非常好的情况的,会生成core文件,比较容易发现;最怕的是程序没有报错,而是指针刚好指向了一个可以访问的内存地址,通过这个指针变量把一些不该修改的数据给改掉了。
3.简单来说,NULL的作用就是当一个指针变量没有被显性初始化时,将该指针变量的值赋为NULL。解引用前判断指针变量是否为NULL,如果为NULL说明该指针没有初始化过,不可解引用。

为什么要将未初始化的指针变量指向NULL?

1.首先解引用一个指向未知地址的指针变量是很危险的,由此我们需要判断一个指针变量是否已经被初始化。于是行形成一个规定,定义一个指针变量时就将其赋值为NULL,只要我们判断一个指针是NULL,就是未初始化不可解引用的。这样可以防止我们错误的解引用指针。
2.NULL是一个特殊的地址,在操作系统中定义该地址是不可以访问的,我猜测NULL也就是0地址是操作系统内核的地址,用户是不可访问的。一旦我们去解引用NULL地址,就会报段错误。报错误这已经是非常好的结果了,可以让我们及时的发现错误。

  • 72
    点赞
  • 295
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值