有没有理由为空指针使用十六进制表示法?

时间:2010-01-25 09:47:31

标签: language-agnostic pointers null hex

我目前正在改进COM组件的一部分,将所有外部调用记录到文件中。对于指针,我们写(IInterface*)0x12345678之类的值,其值等于实际地址。

目前,对于空指针没有区别 - 它们显示为0x0,其中IMO不是最理想且不优雅。改变这种行为根本不是问题。但首先我想知道 - 在十六进制中表示空指针有什么真正的优势吗?

8 个答案:

答案 0 :(得分:2)

在C或C ++中,您应该能够使用标准%p格式代码,这样就可以使您的指针看起来像其他人一样。

我不确定%p在Win32中如何格式化空指针,在Linux上我认为你得到“null”或类似的东西。

答案 1 :(得分:2)

使用符号0x0(IMO)可以更清楚地表明它是指一个地址(即使它不是空指针的内部表示)。 (在实际代码中,我更喜欢使用NULL宏,但听起来好像你在谈论调试spew。)

它提供了一些上下文,就像我更喜欢使用'\0'作为NUL终结符。

这是一种风格偏好,所以吸引你(以及你的同事)也是如此。

答案 2 :(得分:1)

最终都是正零。

答案 3 :(得分:1)

有:您可以随时将它们转换回数字(0),而无需额外的努力。唯一的缺点是可读性。

答案 4 :(得分:1)

没有理由更喜欢(SomeType *)0x0到(SomeType *)0。

顺便说一下:在C中,空指针常量是一个有点奇怪的结构;即使某些机器上的内部表示可能与数值0不同,编译器也会将(SomeType *)0识别为“空指针”。它更像是SQL中的NULL - 而不是“实际”指针值。实际上,我所知道的所有机器都将空指针建模为“0”地址。

答案 5 :(得分:1)

我很确定十六进制表示法是内存布局的结果。存储器是字对齐的,如果你在32位处理器上,那么一个字是32位。这些单词被分段为页面,这些页面排列在页面表格等中。等号表示法是理解这种安排的唯一方法(除非你真的喜欢使用你的计算器)。

答案 6 :(得分:1)

就个人而言,我将0x0打印到日志文件[*]。有一天,当有人自动解析文件时,数据越均匀越好。我没有发现0x0难以阅读,所以在编写器代码中有一个特殊情况,而在读者代码中有另一个特殊情况似乎很愚蠢,这是我无法想到的。​​

0x00更适合于为日志填充日志:保存你必须弄清楚你应该为)0或其他有趣的事情进行掠夺。

但是,我不会在C或C ++中为空指针常量编写0x0。我写的非空地址非常令人难以置信,因为空值无法统一。我想如果我定义了一堆常量来表示某个设备的内存映射,零地址在该内存映射中是重要的,那么我可能会在该上下文中将其写为0x0

[*]或者0x00000000。我喜欢打印8个字符长的32位指针,因为当我读取/记住指针时,我从左边开始成对出现。如果事实证明有7个字符,我最后会感到非常困惑;-)。 64位指针没关系,因为我记不起那个长的数字......

答案 7 :(得分:1)

我的观点是,为了便于阅读,请考虑一下,如果你要看0,那是什么意思,这是否意味着它是无符号整数,或者如果它是0x0,那么本能地,它与它有关二进制表示法,更可能取决于平台。

由于标签与语言无关,并且单词'空指针',在Delphi / Object Pascal中,它是'nil',在C#中,它是'null',在C / C ++中它是'NULL'。< / p>

请参阅C-FAQ中的示例,在Section 5中关于NULL指针,特别是5.45.55.65.7给出你了解这一点。

简而言之,空指针的用法和表示法取决于

  • 使用什么语言?
  • 语言规范的语义和语法。
  • 什么类型的编译器?
  • 平台类型,根据内存的访问方式,处理器,位......

希望这有帮助, 最好的祝福, 汤姆。