【发布时间】:2011-04-19 19:49:28
【问题描述】:
显然,取消引用无效指针会导致未定义的行为。但是在指针变量中简单地存储一个无效的内存地址呢?
考虑以下代码:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
表达式begin - 1 的计算结果为无效的内存地址。请注意,我们实际上并没有取消引用这个地址——我们只是在指针运算中使用它来测试它是否有效。尽管如此,我们仍然需要将无效的内存地址加载到寄存器中。
那么,这是未定义的行为吗?我从没想过是这样,因为很多指针算术似乎都依赖于这种东西,而指针实际上只不过是一个整数。但是最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为如果您这样做,某些架构会自动抛出总线错误或其他东西。任何人都可以指出 C 或 C++ 标准的相关部分来解决这个问题吗?
【问题讨论】:
-
根据 C/C++ staqndard,这确实是未定义的行为。但是,坦率地说,我从未见过真实世界的 CPU/架构在上面是未定义的行为,即不允许任意指针运算的机器。我见过很多架构,包括嵌入式微控制器。所以,在我(谦虚)看来,代码是可以的,只要你把自己限制在现代非深奥的架构中。
-
你能否扩展这个问题 - 如果你有循环,你在哪里向后遍历数组?在这个遍历中,你肯定需要在第一个元素之前检查元素,而不是取消引用它。我有类似的问题,但它是最后一个元素之后的元素。