我最近看到一篇文章提到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?它会打破这个计划吗?
答案 0 :(得分:7)
Visual Studio生成的0xCACACACA
通常用于未初始化的指针,正是出于这个原因。当你看到这个,你知道出了什么问题。如果它将其初始化为0
,则很可能是预期的行为。这只能在调试节点中完成,通过完全优化,未初始化指针的值将只是垃圾。
是的,NULL
指针每个说法的值不是0
。 0
只是一个文字。实际值可能不同。但编译器足够聪明,可以将其抽象出来,所以即使你有一个NULL指针,其值实际上不是0(如数字0),将它与0
或NULL
进行比较仍然是屈服真实。最好用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)。
空指针常量可以转换为任何指针类型(或指向成员的指针类型),它获取空指针值。这是一个特殊值,表示指针未指向任何对象。