c++ - 存储无效指针是否自动未定义的行为?

标签 c++ c pointers

显然,取消引用无效指针会导致未定义的行为。但是在指针变量中简单地存储一个无效的内存地址呢?

考虑以下代码:

const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }

表达式 begin - 1 计算为无效的内存地址。请注意,我们实际上并没有取消引用这个地址——我们只是在指针运算中使用它来测试它是否有效。尽管如此,我们仍然需要将无效的内存地址加载到寄存器中。

那么,这是未定义的行为吗?我从没想过是这样,因为很多指针算术似乎都依赖于这种东西,而指针实际上只不过是一个整数。但是最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为如果您这样做,某些架构会自动抛出总线错误或其他东西。任何人都可以指出 C 或 C++ 标准的相关部分来解决这个问题吗?

最佳答案

我这里有 C 草案标准,它通过遗漏使其未定义。它定义了 ptr + I 在 6.5.6/8 for

的情况
  • 如果指针操作数指向数组对象的一个​​元素,并且数组足够大,则结果指向一个与原始元素偏移的元素,使得结果和原始数组元素的下标之差等于整数表达式。
  • 此外,如果表达式 P 指向数组对象的最后一个元素,则表达式 (P)+1 指向数组对象的最后一个元素,如果表达式 Q 指向数组对象的最后一个元素数组对象,表达式 (Q)-1 指向数组对象的最后一个元素。

您的情况不符合其中任何一项。您的数组也不够大,无法让 -1 调整指针以指向不同的数组元素,任何结果或原始指针也不会指向过去。

关于c++ - 存储无效指针是否自动未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838855/

相关文章:

c++ - 减少 c++ 链接时间的技巧

c - 初学者 C 程序员需要指针帮助(我认为)

c++ - 将字节数组转换为标准数据类型

c - 数组的空闲分配内存(与普通变量相比?)

c++ - 枚举 C++ 按索引获取

c++ - 为什么 SFINAE 在更改类模板特化的位置时会搞砸?这是 C++ 错误吗?

c - 我如何更改此代码以在没有 strstr 函数的情况下工作?

C 程序未编译

c++ - 我可以通过递增指针来移动数组吗? Qt

c++ - std::stol 问题 - 'std::invalid_argument' what(): stol