初级 C++ 数组

Sca*_*ett 5 c++ arrays

我是 C++ 新手。下面是输入和显示数组的代码——很容易理解事物的工作原理。

int main() {
  int N, i;
  int A[N];
  cin >> N;
  for (i = 0; i < N; i++) {
    cin >> A[i];
  }
  for (i = 0; i < N; i++) {
    cout << A[i];
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入是:

4
1 2 3 4
Run Code Online (Sandbox Code Playgroud)

输出是:

12
Run Code Online (Sandbox Code Playgroud)

我已将我的代码更正为:

int N, i;
cin >> N;
int A[N];
Run Code Online (Sandbox Code Playgroud)

这可以正确显示数组。

究竟发生了什么?在初始化 A[N] 之前 N 应该有一个值吗?但为什么我最初的代码不起作用呢?这与等级制度有关吗?如果是这样,我怎样才能正确处理我的优先事项?

如果N初始化为一个大值,那么N接下来会有一个特定数字的输入,如果这样的话,为什么即使N=9,输出仍然是相同的:12?

Bil*_*nch 7

在初始化 A[N] 之前 N 是否应该有一个值

是的。它应该。它甚至应该在声明之前有一个值A[N]。否则运行时如何知道要分配多少空间A


jus*_*bie 3

来回答你的问题。

int N, i;
Run Code Online (Sandbox Code Playgroud)

在这里,您声明N,但因为您没有为 赋值NN因此未初始化并且可以保存任何值(可能是某些旧程序的值)。并且您使用 来创建一个数组N,这将导致一些意外的行为。(例如N太大时可能会发生堆栈溢出)

和:

C++ 中数组的大小必须在编译时已知。这意味着当编译器编译程序时,必须知道数组的大小。

就您而言,您在运行时n知道(大小),这意味着只有当您运行程序时,您才知道 的值,即大小。n

您的代码运行是因为(可能)gcc编译器确实有一个扩展可以实现这种情况,但因为这不是标准 C++,所以我建议不要使用它。

C++ 有一个运行时数组的解决方案,位于标头std::vector<vector>

你只需要改变:

cin >> N;
int A[N];
Run Code Online (Sandbox Code Playgroud)

到:

std::cin >> n;
std::vector<int> A(N);
Run Code Online (Sandbox Code Playgroud)

注意using namespace std;不好,所以不要使用它。