2013-05-30 58 views
2

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

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

这东西绑在我在Visual Studio中,其中一个指针的值0xCACACACA(或类似的东西),当它是一个糟糕的指针调试C++时看到(但这可能只是显示的值我们的利益)。

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

编辑:

另外,(只是作为一个扩展名)是什么做的?

int i = 0; 

// pretend to do some stuff with i 

char* = (char*)i; 

编译器会在运行时将指针设置为null还是将其设置为零?如果它是后者是UB?它会打破这个计划吗?

+0

你在找什么样的答案?一个列表? – Niko

+1

您可以阅读:http://c-faq.com/null/machnon0.html – jxh

+0

您说的NULL实际上是依赖于实现的。检查为c + +和为C.但在c/c + +模型中,你可以认为NULL为0. –

回答

7

由Visual Studio生成的0xCACACACA通常是那里未初始化的三分球,正是这个原因。当你看到这个,你知道有什么不对。如果它初始化为0,它可以很好地预期行为。这只是在调试节点中完成的,通过完全优化,未初始化指针的值将只是垃圾。

是的,NULL指针没有一个值0每说。 0只是一个文字。实际值可能不同。但是编译器足够聪明,可以将它抽象出来,所以即使你有一个空值指针,其值不是0(如数字0),将它与0NULL进行比较仍然可以。真的可以考虑nullptr

+1

然而,我从来没有听说过任何** NULL指针的值不包含所有0位的架构。 – mvp

+0

如果您将cast和整数值为0的值输入到指针并指定它,该怎么办?那时它已经脱离了编译器的手中,会发生什么? –

+0

@MrUniverse它是一个值为0的指针 - 不一定是空指针,但可能是大多数平台上的空指针。 –

0

空指针的值保留用于指示指针不引用有效对象。空指针通常用于表示条件,例如未知长度的列表的末尾或未执行某些操作;这种空指针的使用可以与空类型和选项类型中的Nothing值进行比较。

我希望这会清除你,但更多请访问this

+0

物理上它们是不使用的垃圾值。 – user2384794

0

NULL字符本义像NOP-时发送到打印机或一个终端,它不执行任何操作以C,C(一些终端,然而,不正确地显示其作为空间)

井++; 空指针常量可以是求值为0的整型常量表达式(例如0或0L),也可以是类型为nullptr_t(例如nullptr)的值。

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

请参阅本 http://bytes.com/topic/c/answers/213647-null-c

4

这个问题以前出现在comp.lang.c新闻组。您可以read the archive with Google Groups

在该线程,保罗引述沙另一个来源为“Portable C”由H. Rabinowitz和哈伊姆Schaap,具体如下:

某些总理计算机使用不同的值,从全位 - 0到 编码空指针。此外,一些大型Honeywell-Bull机器使用位模式06000来编码空指针。在这样的机器上, 指定0到指针产生 指定空指针的特殊位模式。

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

如果你经常看到非空指针是与物理内存地址工作时(即当没有MMU或者内核模式中绕过MMU)和机器有内存映射I/O在地址0处或附近。你想要一个空指针在无人地带出路,所以如果你抵消它(例如通过指针访问结构成员),你将得不到任何有用的地址。

对于您的具体问题,只有积分常量表达式的值0被解释为空指针。所以

char* p = (char*)i; 

便携使p一个空指针(即标准没有这样的保证,但您的特定编译器)。