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地址,就会报段错误。报错误这已经是非常好的结果了,可以让我们及时的发现错误。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐