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

时间:2015-10-06 06:28:39

标签: 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;
}

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

class array {
    public:
        int *arr;
// ...

class array {
    public:
        int arr[1];
// ...