在分配给不安全代码中的指针时,null和0之间有什么区别吗?

时间:2010-05-05 00:24:02

标签: c# unsafe

这可能看起来很奇怪,但在C(size_t)(void *)中,语言规范无法保证0 == 0。允许编译器使用他们想要的任何值为null(尽管它们几乎总是使用0。)

在C#中,您可以为不安全代码中的指针指定null或(T *)0。

  1. 有什么区别吗?
  2. (长)(void *)0 == 0(保证或 不?换一种方式: IntPtr.Zero.ToInt64()== 0)
  3. MSDN对此有关于IntPtr.Zero的说法:

    “此字段的值不等于null。”好吧,如果你想与C代码兼容,这很有意义 - 如果没有转换为C空指针,它对于互操作是没有价值的。但是我想知道IntPtr.Zero.ToInt64()== 0这是否可能,即使内部IntPtr.Zero是其他一些值(在转换操作中CLR可能会也可能不会将null转换为0)

    不是this question

    的副本

2 个答案:

答案 0 :(得分:5)

你可以避免这个问题:

char* foo = (char*)(void*)0;
char* bar = default(char*); // <======= the one to look at
Console.WriteLine(foo == bar); // writes True

所以它们是相同的,但是使用default避免了必须在代码中嵌入任何假设或讨厌的强制转换。反汇编以上内容,唯一的区别是有符号/无符号 - 都以4字节常量(i4 / u4开头)然后强制转换为native-int(i / {{1} }(u评论是我的):

//

答案 1 :(得分:0)

在C中,NULL被定义为特定于体系结构。虽然大多数架构使用0,但有些架构不使用。所以,你不能假设C. {/ p>中的NULL == 0

不太确定它在C#中是如何工作的,但我建议您坚持使用在C#中指定NULL的标准方式,而不是将其强制转换为0。