小编use*_*574的帖子

&array[i] 总是等价于 (array + i) 吗?

最近看到一段C代码是这样的:

#include <stdio.h>

int main(void) {
    int array[5] = {1, 2, 3, 4, 5};

    for (int* ptr = &array[0]; ptr != &array[5]; ptr++)
        printf("%d\n", *ptr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于运算[]&在 C 中优先于运算符,因此我认为&array[5]等效于&(*(array + 5)),这会导致未定义的行为(我们不允许取消引用array + 5)。这就是为什么我怀疑上面的代码格式错误。(顺便说一下,我知道这ptr != array + 5没关系。)

我使用带有-O0 -fsanitize=address,undefined编译器标志的GCC 11.1.0 和 Clang 12.0.0 测试了这段代码,但两个编译器都解释&array[5]array + 5,并且没有发生意外行为。

是否&array[i]总是等同于array + i(即使array[i]是无效的)?先感谢您。

c pointers undefined-behavior language-lawyer

4
推荐指数
1
解决办法
207
查看次数

标签 统计

c ×1

language-lawyer ×1

pointers ×1

undefined-behavior ×1