CPP阵列内存分配



在这里,我在为n输入之前声明数组长度。在声明数组时,n=0。

#include <iostream>
using namespace std;
int main() {
int n;
int sum=0;
int arr[n]={};
cin >> n;
for(int i=0;i<n;i++) {
cin >> arr[i];
cout << arr[i];
}
return 0;
}

用于以下输入6.1 2 3 4 5 6

我得到这个输出1234。

有人能解释一下原因吗?

这里我在为n输入之前声明数组长度。

是的,但这不是有效的C++。它是编译器特定的扩展。请参阅为什么可变长度数组不是C++标准的一部分?

在数组声明n=0时。

这是错误的。n尚未初始化,因此它包含垃圾数据(可能为0(。读取n会调用未定义的行为。

即使n为0,循环也会越界访问数组,并再次调用未定义的行为。

讨论调用未定义行为的程序的输出是毫无意义的——任何事情都可能发生。唯一的原因是避免UB。做到这一点的一些好做法:

  • 始终将变量初始化为合理值
  • 使用std::vector而不是普通阵列/VLA

最新更新