在 C 语言(或者 C + + 语言)中,如果指针的值为零,那么指针就是特殊的: 我建议在释放内存后将指针设置为零,因为这意味着再次释放指针并不危险; 当我调用 malloc 时,如果它不能得到内存,它会返回一个值为零的指针; 我一直使用 if (p != 0)
来确保传递的指针是有效的,等等。
但是既然内存寻址从0开始,那么0不就是一个有效的地址吗?如果是这种情况,0如何用于处理空指针?为什么负数不是零呢?
编辑:
一堆好答案。我将总结一下在回答中所说的话,因为我自己的头脑会解释它,并希望社区会纠正我,如果我误解了。
和编程中的其他东西一样,它也是一个抽象概念。只是一个常数,与地址0没有实际关系。C + + 0x 通过添加关键字 nullptr
来强调这一点。
它甚至不是一个地址抽象,它是由 C 标准指定的常量,编译器可以将它转换成其他数字,只要它确保它永远不等于一个“真正的”地址,并等于其他空指针,如果0不是平台使用的最佳值。
如果它不是一个抽象,在早期的情况下,地址0是系统使用的,对程序员来说是禁止的。
我承认,我的负数建议是一个有点疯狂的头脑风暴。对地址使用有符号整数有点浪费,如果它意味着除了空指针(-1或其他)之外,值空间被均匀地分割在正整数之间,正整数是有效的地址,负数是浪费的。
如果任何数字总是由数据类型表示,那么它就是0。(大概1也是。我想到的是一位整数,如果是无符号的,就是0或1,如果是有符号的,就是有符号的,或者是两位整数,就是[-2,1]。但是你可以选择0为 null,1为内存中唯一可访问的字节。)
我心里还有一些事情没有解决。Stack Overflow 问题 指向特定固定地址的指针告诉我,即使0 for null 指针是一个抽象,其他指针值也不一定是。这导致我发布另一个堆栈溢出问题,我曾经想要访问地址0吗。