C++ C++;什么是空指针值?

C++ C++;什么是空指针值?,c++,c,null,C++,C,Null,我最近看了一篇文章,其中提到C/C++中的空指针实际上不仅仅是零,而是由编译器解释为平台的空分配地址 这与我在VisualStudio中调试C++时看到的一些东西,其中指针的值是0xCACACACA(或类似的东西),当它是一个坏指针时(但是这可能是为了我们的利益而显示的值)。 长话短说,平台(如windows)的真正空指针地址是什么?还是我完全误解了答案 编辑: 还有,(作为扩展)这是什么意思 int i = 0; // pretend to do some stuff with i ch

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

<>这与我在VisualStudio中调试C++时看到的一些东西,其中指针的值是0xCACACACA(或类似的东西),当它是一个坏指针时(但是这可能是为了我们的利益而显示的值)。 长话短说,平台(如windows)的真正空指针地址是什么?还是我完全误解了答案

编辑:

还有,(作为扩展)这是什么意思

int i = 0;

// pretend to do some stuff with i

char* = (char*)i;

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

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


我希望这会让您明白,但有关更多信息,请访问Visual Studio生成的
0xcacaca
,它通常用于未初始化的指针,正是出于这个原因。当你看到这一点,你就知道出了问题。如果它将其初始化为
0
,则很可能是预期的行为。这只在调试节点中完成,如果进行完全优化,未初始化指针的值将只是垃圾


是的,
NULL
指针的值不是
0
<代码>0只是一个文字。实际值可能不同。但是编译器足够聪明,可以将其抽象出来,因此即使您有一个空指针,其值实际上不是0(如数字0),将其与
0
NULL
进行比较仍然会得到true。最好从
nullptr
的角度来考虑。

空字符的原始含义就像NOP一样,当发送到打印机或终端时,它什么也不做(但是,有些终端错误地将其显示为空格)

<> > C,C++; 空指针常量可以是计算结果为零的整型常量表达式(如0或0L),也可以是类型为nullptr_t的值(如nullptr)

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

参考此

这个问题以前出现在comp.lang.c新闻组上。你可以

在这篇文章中,Paul Sand引用了另一个来源,H.Rabinowitz和Chaim Schaap的“便携式C”,如下所示:

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

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

在使用物理内存地址时(即,没有MMU或在内核模式下绕过MMU),机器在地址
0
处或附近有内存映射I/O时,通常会看到非空指针。您希望空指针位于无人区之外,因此如果偏移它(例如,通过指针访问结构成员),您将无法获得任何有用的地址

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

char* p = (char*)i;

不可移植的使
p
成为空指针(即标准不作此保证,但您的特定编译器可以)。

您想要什么样的答案?列表?您可以阅读:您说NULL实际上依赖于实现是正确的。检查C++和C,但是在C/C++模型中,你可以认为NULL是0。@ NIKO不是完整的列表,而是一些参考资料。然而,我从来没有听说过任何结构,代码“> null //Cux.Posit都有一个不包含所有0位的值。如果你把Casic和值0的整数键入指针,然后分配它,你会怎么办?”在这一点上,编译器无法控制它,会发生什么?@MrUniverse它是一个值为0的指针-不一定是空指针,但在大多数平台上可能是空指针。那么它是UB还是具有非零空指针的平台会“随它去”。@MrUniverse你根本不应该这样做。它可以工作,也可以不工作。不要随机分配指针。4物理上,指针是不可使用的垃圾值。