显然,对无效指针进行解引用会导致未定义行为。但是,将无效内存地址简单地存储在指针变量中又如何呢?
考虑以下代码:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
表达式 begin - 1
的计算结果是一个无效的内存地址。请注意,我们实际上并没有引用该地址 - 我们只是在指针算术中使用它来测试它是否有效。尽管如此,我们仍然必须将一个无效的内存地址加载到寄存器中。
那么,这是未定义行为吗?我从来没有这样认为过,因为许多指针算术似乎都依赖于这种东西,而指针本质上只是一个整数。但最近我听说,即使是将无效指针加载到寄存器中的操作也是未定义的行为,因为某些体系结构会自动抛出总线错误或其他错误。有人能否向我指出C或C ++标准中解决这个问题的相关部分?