首页 > 解决方案 > 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。

有人可以解释原因吗?

标签: c++arrays

解决方案


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

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

在数组声明时 n=0。

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

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

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

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

推荐阅读