什么是NULL指针值?
C++ What are the NULL pointer values?
我最近看到一篇文章,其中提到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),将其与0
或NULL
进行比较仍然会产生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
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?
- 指针永远不会在链表深层复制构造函数中达到 null
- 正在将对象指针数组初始化为NULL
- 为什么在C++中使用delete后指针不为NULL
- C++中的指针否定 (!ptr == NULL)
- 如何返回值为NULL的变量指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果指针在C++为 NULL 则修改指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 从转储中获取调用堆栈的几乎所有帧中的此指针 NULL 表明什么
- 指针 NULL 在C++中的函数
- 自动指针= NULL错误
- 如何使指针指向指针NULL
- 当我们分配指针 NULL 时会发生什么