存储无效指针总是未定义行为吗?
在 C 和 C 中,取消引用无效指针会导致未定义行为。然而,出现了一个问题:仅仅在指针变量中存储无效的内存地址是否会构成未定义的行为?
考虑以下代码:
<code class="c">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
这里,表达式 begin - 1 的计算结果为无效的内存地址。虽然我们避免取消引用它,但我们在指针算术中利用它来确定其有效性。那么,考虑到某些架构可能在将无效指针加载到寄存器时触发总线错误,此操作是否会导致未定义的行为?
这个问题的答案位于 C 或 C 标准中。根据 C 标准草案,存储无效指针确实是未定义的行为。标准的第 6.5.6/8 节定义了指针算术,但它没有明确涵盖操作数指向无效内存地址的情况。
因此,由于遗漏,C 标准未指定这种情况,使其呈现未定义的行为。因此,根据当前标准,在指针变量中存储无效指针,即使未取消引用,也会被视为 C 和 C 中的未定义行为。
以上是## 在 C/C 中存储无效指针总是未定义的行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!