21
为什么地址零用于空指针?
在C(或C ++)中,如果指针的值为零,则它是特殊的:建议释放它们的内存后将指针设置为零,因为这意味着再次释放该指针并不危险;当我调用malloc时,如果无法获取内存,它将返回一个值为零的指针;我if (p != 0)一直在确保传递的指针有效,等等。 但是由于内存寻址从0开始,难道不是0像其他地址一样有效吗?在这种情况下,如何使用0来处理空指针?为什么负数不为null? 编辑: 一堆好答案。我将总结一下我的内心理解后所表达的答案中的内容,并希望如果我误会,社区会纠正我。 像编程中的所有其他内容一样,它是一种抽象。只是一个常数,与地址0无关。C++ 0x通过添加关键字来强调这一点nullptr。 它甚至不是地址抽象,它是C标准所指定的常数,并且编译器可以将其转换为其他数字,只要确保它永远不等于“真实”地址即可,如果0不等于,则等于其他空指针。平台使用的最佳价值。 如果不是早期的抽象,那么系统将使用地址0,而程序员无法使用该地址。 我承认,我的负面建议是有点疯狂的头脑风暴。如果对地址使用带符号的整数会造成一点浪费,这意味着除了空指针(-1或其他值)以外,值空间在构成有效地址的正整数和刚刚浪费的负数之间平均分配。 如果任何数字始终可以用数据类型表示,那么它就是0。(可能也是1。我认为一位整数(如果是无符号的,则为0或1),或者如果签名则只是有符号的位,或者是两位整数将会是[-2,1]。但是您可以将0设为null,将1设为内存中唯一可访问的字节。) 我脑子里仍然有一些未解决的事情。指向特定固定地址的堆栈溢出问题指针告诉我,即使空指针的0为抽象,也不一定需要其他指针值。这导致我发布了另一个堆栈溢出问题,我是否想访问地址零?。