c++ - 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。