C ++什么是NULL指针值?

时间:2013-05-30 05:54:53

标签: c++ c null

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

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

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

如此长篇简短,平台(如windows)的REAL空指针地址是什么?还是我完全误解了答案?

编辑:

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

int i = 0;

// pretend to do some stuff with i

char* = (char*)i;

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

此问题之前出现在comp.lang.c新闻组中。你可以read the archive with Google Groups

在那篇帖子中,Paul Sand引用H. Rabinowitz和Chaim Schaap的另一个来源“Portable C”,如下:

  

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

     

同样,(char *)0会产生特殊效果   用于指定空指针的位模式。

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

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

0

没有可移植使char* p = (char*)i; 成为空指针(即标准不做这样的保证,但是您的特定编译器可能会这样做。)

答案 2 :(得分:0)

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

我希望这会让你清楚但是更多请访问this

答案 3 :(得分:0)

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

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

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

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