CPP阵列内存分配

时间:2020-08-23 15:01:45

标签: c++ arrays

在这里,我在输入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。

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:2)

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

是的,但这不是有效的C ++。这是特定于编译器的扩展。参见Why aren't variable-length arrays part of the C++ standard?

在数组声明时n = 0。

错了。 n尚未初始化,因此其中包含垃圾数据(可能为0)。读n会引起未定义的行为。

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

讨论调用未定义行为的程序的输出是没有意义的-可能发生任何事情。唯一的理由是避免UB。一些好的做法可以做到这一点:

  • 始终将变量初始化为合理的值
  • 使用std::vector代替纯数组/ VLA。