如果我知道访问地址上有哪些数据,那么越界访问数组是否是未定义的行为?

Urw*_*ald 3 c++ stack undefined-behavior

想象一下下面的定义。

struct X {
    double a[8] {0.0};
    double b[8] {0.0};
}

int main() {
    X x;
    x.a[10] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

当我访问时程序的行为是否未定义x.a[10]

Pet*_*etr 11

是的,这是未定义的行为,但不仅仅是因为编译器可能会改变X.

这是未定义的行为,因为标准是这么说的。因此,编译器可以对这段代码执行任何操作:编译器可以完全放弃赋值,可以赋值1.0所有16 个元素,可以更改以前的代码正在执行的操作,可以使程序崩溃,格式化硬盘等。


一个更现实、经典的例子:以下函数

const int table[4] = {2, 4, 6, 8};

bool exists_in_table(int v)
{
    for (int i = 0; i <= 4; i++) {
        if (table[i] == v) return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

总是返回true,至少在现代 gcc 中是这样的-O3https://godbolt.org/z/f9cbWMYzM

  • @mch 是的,它被删除了,你需要 10k 代表才能看到它,[这里是屏幕截图](https://imgur.com/a/A817xG7)。 (4认同)
  • 或者[打印小狗,小狗,小狗](/sf/ask/3988547391/)但有些Joykill删除了这个问题。 (2认同)