为什么编译和运行代码时代码工作正常,即使我没有提到数组的大小?

bor*_*ree 0 c++ segmentation-fault

class array {
    public:
        int arr[];

        array() {
            arr[0] = 1;
            arr[100] = 2;
        }
};

int main() {
    array a;
    cout << a.arr[0] << a.arr[100] << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在运行上面的代码时期待分段错误.但是,它打印了正确的输出,即使我没有提到数组大小.这是什么原因?

Ami*_*mit 5

你得到的是未定义的行为.

读取/写入未分配的内存不会自动生成分段错误,但它当然是"不良实践",应该避免.

不可能准确地告诉这些代码将会发生什么,该数组将被解决,或者已经存在什么,因此 - 未定义的行为.

注意:正如@juanchopanza所提到的,代码本身在C++中是非法的,因为arr是一个不完整的类型.由于默认设置,您的编译器可能(并且显然确实)忽略了这一点,但是可以证明相同行为的合法代码是:

class array {
    public:
        int *arr;
// ...
Run Code Online (Sandbox Code Playgroud)

要么

class array {
    public:
        int arr[1];
// ...
Run Code Online (Sandbox Code Playgroud)