什么是NULL指针值?

C++ What are the NULL pointer values?

本文关键字:指针 NULL 什么      更新时间:2023-10-16

我最近看到一篇文章,其中提到C/c++中的空指针实际上不只是零,而是由编译器解释为平台的任何分配地址为空。

https://stackoverflow.com/a/2760172/2027262

这与我在Visual Studio中调试c++时看到的一些东西有关,当指针是一个坏指针时,指针的值是0xCACACACA(或类似的东西)(但这可能只是为了我们的利益而显示的值)。

长话短说,什么是一个平台(如windows)的真正空指针地址?还是我完全误解了答案?

编辑:

同样,(只是作为一个扩展)这是怎么回事?

int i = 0;
// pretend to do some stuff with i
char* = (char*)i;

编译器会在运行时将指针设置为空还是将其设置为零?如果是,后者是UB吗?它会破坏程序吗?

由Visual Studio生成的0xCACACACA通常用于未初始化的指针,正是由于这个原因。当你看到这个,你就知道出了问题。如果将其初始化为0,则可以很好地实现预期行为。这只在调试节点中完成,在完全优化后,未初始化的指针的值将只是垃圾。

是的,NULL指针没有0的值。0只是一个字面意思。实际值可以不同。但是编译器足够聪明地将其抽象出来,所以即使您有一个NULL指针,其值不是真正的0(如数字0),将其与0NULL进行比较仍然会产生true。实际上,用nullptr来考虑比较好。

这个问题以前出现在comp.lang.c新闻组中。你可以通过Google Groups查看存档

在这个帖子中,Paul Sand引用了另一个来源,H. Rabinowitz和Chaim Schaap的"Portable C",如下:

某些Prime计算机使用不同于全比特0到的值编码空指针。此外,一些大型霍尼韦尔-布尔机器使用编码空指针的位模式06000。在这样的机器上,将0赋值给指针会产生特殊的位模式指定空指针

类似地,(char *)0产生特殊的指定空指针的位模式。

在使用物理内存地址(即没有MMU或在内核模式下绕过MMU)并且机器在地址0或附近有内存映射I/O时,您通常会看到非空指针。你想要一个空指针在无人区,所以如果你偏移它(例如,通过指针访问结构成员),你不会得到任何有用的地址。

对于您的特定问题,只有值为0整型常量表达式被解释为空指针。所以

char* p = (char*)i;

可移植地使p为空指针(即标准没有这样的保证,但您的特定编译器可能会)。

空指针有一个保留值,表示该指针指向的不是有效对象。空指针通常用于表示诸如长度未知的列表结束或执行某些操作失败之类的情况;空指针的这种用法可以与可空类型和选项类型中的Nothing值进行比较。

我希望这能让你明白,但更多信息请访问

NULL字符的原始含义类似于nop -当发送到打印机或终端时,它什么也不做(然而,有些终端错误地将其显示为空格)

精通C, c++;空指针常量要么是求值为零的整型常量表达式(如0或0L),要么是类型为nullptr_t的值(如nullptr)。

空指针常量可以转换为任何获取空指针值的指针类型(或指针到成员类型)。这是一个特殊值,表示指针不指向任何对象。

参考http://bytes.com/topic/c/answers/213647-null-c