在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为空,1是内存中唯一可访问的字节。)
3 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
从历史上看,从0开始的地址空间始终是ROM,用于某些操作系统或低级中断处理例程,如今,由于一切都是虚拟的(包括地址空间),操作系统可以将任何分配映射到任何地址,因此它可以特别是不在地址0分配任何东西。
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
IIRC,“空指针”值不保证为零。编译器将0转换为适合于系统的任何“空”值(实际上它可能总是为零,但不一定是)。无论何时将指针与零进行比较,都会应用相同的转换。因为您只能将指针相互比较并与此特殊值0进行比较,所以它使程序员无法了解有关系统内存表示的任何信息。至于为什么他们选择0而不是42或者某些,我猜它是因为大多数程序员从0开始计数:)(另外,在大多数系统上0是第一个内存地址,他们希望它方便,因为在像我所描述的那样练习翻译很少实际发生;语言只允许它们)。
- 3 回答
- 0 关注
- 961 浏览
添加回答
举报
0/150
提交
取消