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;
}
我在运行上述代码时遇到了分段错误。但是,它打印了正确的输出,即使我没有提到数组大小。这是什么原因?
答案 0 :(得分:5)
你得到的是未定义的行为。
读取/写入未分配的内存不会自动生成分段错误,但它当然是&#34;不良实践&#34;应该避免。
不可能确切地告诉这些代码将会发生什么,该数组将被解决,或者已经存在什么,因此 - 未定义的行为。
注意:正如@juanchopanza所提到的,代码在C ++中是非法的,因为arr
是一个不完整的类型。由于默认设置,您的编译器可能(并且显然确实)忽略了这一点,但是可以证明相同行为的合法代码是:
class array {
public:
int *arr;
// ...
或
class array {
public:
int arr[1];
// ...