获取超出范围的数组元素的地址是否是未定义的行为?

假设我们分配了一个由10个元素组成的字节数组。定义了访问范围内的任何元素。

我了解超出范围的元素读写是未定义的行为。获取超出范围的数组元素的地址是否是未定义的行为?

示例:

#include <stdint.h>
#include <string.h>

int main(void)
{
    uint8_t buf[10];
    memset(buf,sizeof(buf));

    // Defined behavior
    uint8_t a_value = buf[9];

    // Defined behavior
    buf[0] = 1;

    // Undefined behavior?
    uint8_t *addr = &buf[10];
}
ykdsqqf 回答:获取超出范围的数组元素的地址是否是未定义的行为?

&buf[10]是一种特殊情况。您可以获取不带UB的数组“最后一个元素”的地址。但是您不能走得更远,也不能走在第一个元素之前。因此&buf[11]&buf[-1]是UB。

每个请求来自the latest available draft of C18

6.5.3.2/3解释说&buf[10]等效于buf+10

  

同样,如果操作数是[]的结果   运算符,不对&运算符或[]所隐含的一元*进行评估,并得出结果   就像删除了&运算符,并将[]运算符更改为+运算符一样。

和6.5.6 / 8为我们提供了有关+行为的信息:

  

此外,如果表达式P指向   数组对象的最后一个元素,表达式(P)+1指向数组的最后一个元素   对象,如果表达式Q指向数组对象的最后一个元素,则表达式   (Q)-1指向数组对象的最后一个元素。如果指针操作数和结果都指向   到同一数组对象的元素,或者超出数组对象最后一个元素的元素,求值   不会产生溢出;否则,行为是不确定的。

,

没有取消引用或以其他方式使用引用(除某些例外),这并不是未定义的行为。

一个例子:

int x[5];

printf("%zu\n",sizeof(*(x + 1000));   // no UB
本文链接:https://www.f2er.com/3100654.html

大家都在问