这似乎很奇怪,但是在C(size_t)(void *)0 == 0中,语言规范无法保证。允许编译器将其所需的任何值都设置为null(尽管它们几乎始终使用0。)

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

  • 有什么区别吗?
  • (long)(void *)0 == 0(保证或
    不是?换一种方式:
    IntPtr.Zero.ToInt64()== 0)

  • MSDN关于IntPtr.Zero的说法是:

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

    不是this question的副本

    最佳答案

    您可以避免该问题:

    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/u)(//注释是我的):
    .maxstack 2
    .locals init (
        [0] char* foo,
        [1] char* bar)
    L_0000: ldc.i4.0 // (char*)(void*)0;
    L_0001: conv.i
    L_0002: stloc.0 // foo=
    L_0003: ldc.i4.0 // default(char*);
    L_0004: conv.u
    L_0005: stloc.1 // bar=
    L_0006: ldloc.0
    L_0007: ldloc.1
    L_0008: ceq  // foo == bar
    L_000a: call void [mscorlib]System.Console::WriteLine(bool)
    

    关于c# - 在不安全代码中分配指针时,null和0之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2769817/

    10-17 01:45