为什么地址零用于空指针?

在C(或C ++)中,如果指针的值为零,指针是特殊的:我建议在释放内存后将指针设置为零,因为这意味着再次释放指针并不危险。 当我调用malloc时,如果它无法让我记忆,它会返回一个零值的指针; 我一直使用if (p != 0)来确保传入的指针是有效的,等等。

但是由于存储器寻址从0开始,不是0就像其他地址一样是有效地址吗? 如果情况如此,如何使用0来处理空指针? 为什么不是负数而是空数字呢?


编辑:

一堆很好的答案。 我将总结一下在我自己的想法解释它的答案中所说的话,并希望如果我误解,社区会纠正我。

  • 像编程中的其他所有东西一样,它是一种抽象。 只是一个常量,与地址0无关.C ++ 0x通过添加关键字nullptr强调这一点。

  • 它甚至不是地址抽象,它是由C标准指定的常量,只要它确保它永远不等于“真实”地址,编译器就可以将其转换为其他数字,并且如果0不是用于该平台的最佳价值。

  • 如果它不是一个抽象(早期就是这种情况),则地址0被系统使用并且被程序员禁用。

  • 我承认,我的负面数字建议有点疯狂的头脑风暴。 对地址使用带符号的整数有点浪费,如果它意味着除了空指针(-1或任何值)之外,值空间会在正整数之间平均分配,从而使有效地址和负数被浪费。

  • 如果任何数字总是可以用数据类型来表示,那么它就是0.(也可能是1),我想如果是一个无符号的整数,那么这个整数应该是0或1,如果有符号的话只是有符号的位,或者两位整数会是[-2,1],但是你可以让0为空,1为内存中唯一可访问的字节。)

  • 仍然有一些东西在我脑海中没有解决。 堆栈溢出问题指向特定固定地址的指针告诉我,即使空指针的0是抽象,其他指针值也不一定。 这导致我发布另一个堆栈溢出问题,我可以想要访问地址零?


    2分:

  • 只有源代码中的常量值0是空指针 - 编译器实现可以在运行代码中使用它想要或需要的任何值。 某些平台有一个特殊的指针值,该值可能是实施可能用作空指针的'无效'。 C常见问题有一个问题,“真的,有真正的机器真的使用非零空指针,或指向不同类型的指针的不同表示?”,指出几个平台使用这个属性0是C源代码中的空指针在运行时表现不同。 C ++标准有一个注释,它清楚地表明,将“一个整型常量表达式转换为零值总是会产生一个空指针,但转换恰好具有零值的其他表达式不需要产生空指针”。

  • 一个负值可能与平台一样可用作地址 - C标准只需选择一些用于指示空指针的值,并选择零。 我真的不确定是否考虑过其他哨点值。

  • 空指针的唯一要求是:

  • 它保证比较不等于指向实际对象的指针
  • 任何两个空指针会比较相等(C ++提高了这一点,这只需要指向相同类型的指针)

  • 从历史上看,从0开始的地址空间总是ROM,用于某些操作系统或低级中断处理例程,现在由于一切都是虚拟的(包括地址空间),操作系统可以将任何分配映射到任何地址,因此它可以特别是不分配任何地址0。


    IIRC,“空指针”值不保证为零。 编译器将0转换为适合系统的任何“空值”(实际上可能总是为零,但不一定)。 每当您将指针与零比较时,都会应用相同的翻译。 因为你只能比较指针和对这个特殊值0的指针,所以它使程序员不知道系统的内存表示。 至于他们为什么选择0而不是42或者其他,我会猜测这是因为大多数程序员从0开始计数:)(另外,在大多数系统中,0是第一个内存地址,他们希望它很方便,因为在练习翻译就像我描述的那样很少实际发生;语言只是允许它们)。

    链接地址: http://www.djcxy.com/p/31659.html

    上一篇: Why is address zero used for the null pointer?

    下一篇: Why can't we use pointers in Java?