【发布时间】:2018-05-12 23:59:11
【问题描述】:
我编写了一个代码,其中我必须将数组的大小作为用户的输入及其元素并打印出来。
#include <iostream>
using namespace std;
//Compiler version g++ 6.3.0
int main()
{
int i;
cout<<"\nenter the size of array";
cin>>i;
int n[i];
for(int j=0;j<=i;j++)
{
cout<<"\nn["<<j<<"]=";
cin>>n[j];
}
for(int k=0;k<=i;k++)
{
cout<<endl;
cout<<"\nn["<<k<<"]=";
cout<<n[k];
}
}
假设如下:
i 的值为 3(根据用户输入)。
在第一个循环中,j 的条件达到<=i,其中 i 是数组的大小(这不应该发生,因为i 从 0 开始),因此编译器要求我为数组(n[0]、n[1]、n[2] 和 n[3]),但数组的大小仅为 3。它怎么能存储4个对象?
【问题讨论】:
-
由于数组从 0 开始,最后一个元素的索引为 n - 1。因此,C++(和 C)中的循环通常以条件
i < n终止。 -
在 C++ 中,您可以在数组的边界之外进行编写,但您永远不应该这样做,因为这是未定义的行为。但这是可能的!
-
顺便说一句。
int n[i];是一个 VLA(可变长度数组)。 VLA 在 C11 中是可选支持的,但在 C++ 中不支持。如果您的编译器支持这一点,则它是一个非标准扩展。更好:使用std::vector而不是 VLA。 -
int n[i];不是有效的 C++,而是 gcc 的扩展。不要使用扩展,用-std=c++17 -pedantic -Wall编译。 -
数组中的大小是表示一个数组有@user8640354的元素个数。这里的问题是大小是一个变量。在这种情况下,我们使用数组的动态分配(例如在 C 中)和在 C++ 中的
std::vector。在我的回答中阅读更多内容。