存储无效指针
虽然取消引用无效指针会导致未定义的行为,但出现了一个不太明确的问题:在指针变量中存储无效内存地址的行为本身就是未定义行为吗?
考虑以下代码片段:
<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 节概述了当指针指向数组元素并且数组足够大或操作数指向最后一个数组元素时指针算术的语义。上述情况中的行为不属于这些特定情况。因此,存储无效指针是通过省略未定义行为。
以上是存储无效的指针地址是未定义的行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!