C语言之NULL

C语言之NULLC 语言中的 NULL 的解析 c 语言 null

大家好,欢迎来到IT知识分享网。

一:NULL在C/C++中的标准定义

        (1)NULL不是C语言的关键字,本质上是一个宏

        (2)NULL的标准定义:

                #ifdef _cplusplus      //条件编译

                #define NULL  0

               #else

               #define NULL  (void *)0

                #endif

C++的编译环境中,编译器预先定义了一个宏: _cplusplus  ,程序中可以用条件编译来判断当前的编译环境是C还是C++的

NULL的本质解析:NULL的本质是0,但是这个0不是当一个数字解析,而是当一个内存地址来解析的,这个0其实是0x00000000,代表内存0地址。 (void *)0这个整体表达式表示一个指针,这个指针变量本身占四个字,地址在哪里取决于于编译器把这个指针变量分配在哪里,但是这个指针变量的值为0,也就是说这个指针变量指向0地址(实际是0地址开始的一段内存)

二:从指针角度理解NULL的本质

        (1)int *p;  //如果p是函数内部的局部变量,则p的值随机的,也就是说p是一个野指针

        (2)int *p;  //p是一个局部变量,分配在栈上的地址是由编译器决定的,程序员不必关心,但是p的值是 (void *)0,实际就是0,意思就是指针p指向内存的0地址处。这时候p就不是野指针了

        (3)为什么要让一个野指针指向内存地址0处?主要是因为在大部分cpu中,内存的0地址都是不可以随便访问的(一般都是操作系统严密监控地区,所以应用程序不能随便访问)所以野指针指向了这个区域可以保证野指针不会造成误伤。如果程序无意识的解引用指针0地址处的野指针则会触发段错误。这样就可以提示你帮助你找到程序中的错误

三:为什么需要NULL

        (1)第一个作用就是让野指针指向0地址处安全

#inlude <stdio.h> int main(void) {   int *p = NULL;          //定义时立即初始化为NULL                               p = xx;         if(NULL ! =p)             {                         *p               //在确认指针p不等于NULL时才去解引用p                                              }         p = NULL; //用完之后p立即再次等于NULL }

         

注意: 一般比较一个指针和NULL是否相等不写成if(p==NULL)  ,而写成if(NULL == p)

        原因是:第一种如果不小心把 == 写成了 =  编译器不会报错 ,而第二种 == 写成 = 编译器会发现并报错

四:不要混用NULL和‘0’

        (1)‘\0’ 和 ‘0’ 和 0 和NULL几个区分开

        (2)’\0’是一个转义字符,它对应的ASCII编码值是0,本质就是0

        (3)‘0’是一个字符,对应的ASCII的编码值是48,本质是48

        (4)0是a一个数字,本质就是0

        (5)NULL是一个表达式,是强制类型转换为void * 类型的0,本质是0

总结: ‘\0’用法是C语言字符串的结尾标志,一般用来比较字符串的字符以判断字符串有没有到头;

        ‘0’是字符0,对应0这个字符的ASCII编码,一般用来获取0的ASCII码值;

        0是数字用来比较一个int类型的数字是否等于0;

         NULL是一个表达式一般用来比较指针是否是一个野指针;

        

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/149388.html

(0)
上一篇 2025-03-24 14:25
下一篇 2025-03-24 14:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信