显然,取消引用无效指针会导致未定义的行为.但是如果只是在指针变量中存储无效的内存地址呢?
请考虑以下代码:
const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }
Run Code Online (Sandbox Code Playgroud)
表达式begin - 1
求值为无效的内存地址.请注意,我们实际上并没有取消引用此地址 - 我们只是在指针算法中使用它来测试它是否有效.尽管如此,我们仍然需要将无效的内存地址加载到寄存器中.
那么,这是不确定的行为吗?我从来没有想过,因为很多指针算法似乎依赖于这种事情,而指针实际上只是一个整数.但最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为某些架构会自动抛出总线错误或者其他内容.任何人都可以向我指出C或C++标准的相关部分,无论哪种方式解决这个问题?
Joh*_*itb 14
我在这里有C草案标准,并且由于遗漏而未定义.它定义了ptr + I
6.5.6/8的情况
你的案子不适合这些.您的数组也不够大,无法-1
调整指针指向不同的数组元素,也不会将任何结果或原始指针指向一个接收端.
jal*_*alf 10
您的代码是未定义的行为,原因不同:
表达begin - 1
并不能产生一个无效的指针.这是未定义的行为.您不能在超出您正在处理的数组范围内执行指针算术.因此减法本身是无效的,而不是存储结果指针的行为.
一些架构具有用于保持指针的专用寄存器.将未映射的地址的值放入这样的寄存器中是允许崩溃的.允许整数溢出/下溢崩溃.由于C的目标是在各种平台上工作,因此指针提供了一种安全编程不安全电路的机制.
如果您知道自己不会在具有这种挑剔特性的异国硬件上运行,则无需担心语言未定义的内容.它由平台明确定义.
当然,这个例子是糟糕的风格,没有充分的理由去做.