gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:09:45 24 4
gpt4 key购买 nike

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

考虑以下代码:

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 的情况

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

您的案例不符合其中任何一个。您的数组不够大,无法让 -1 调整指针以指向不同的数组元素,也没有任何结果或原始指针指向后一末端。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com