【问题标题】:Array size in C++ [duplicate]C ++中的数组大小[重复]
【发布时间】: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 的条件达到&lt;=i,其中 i 是数组的大小(这不应该发生,因为i 从 0 开始),因此编译器要求我为数组(n[0]n[1]n[2]n[3]),但数组的大小仅为 3。它怎么能存储4个对象?

【问题讨论】:

  • 由于数组从 0 开始,最后一个元素的索引为 n - 1。因此,C++(和 C)中的循环通常以条件 i &lt; 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。在我的回答中阅读更多内容。

标签: c++ arrays loops


【解决方案1】:

改变这个:

for(int j=0;j<=i;j++)

到这里:

for(int j = 0; j < i ; j++)

因为数组索引以数组大小减 1 结束。在您的情况下为 i - 1

同样,你需要for(int k=0;k&lt;i;k++)

通过越界访问数组,您发布的代码调用了未定义的行为


这个:

int n[i];

是一个可变长度数组 (VLA),它不是标准 C++,但被一些扩展支持。

如果你使用pedantic 标志编译,你会得到:

prog.cc: In function 'int main()':
prog.cc:9:9: warning: ISO C++ forbids variable length array 'n' [-Wvla]
  int n[i];
         ^

如果你想要这样的数据结构,那么我建议你改用std::vector,它是标准 C++。


顺便说一句,这不是语法错误之类的,而是i 通常用作计数器(就像您使用j 一样),如果您愿意,可以作为一个i索引。因此,我会将它的名称更改为大小,例如,或相关的东西。


编辑:

std::vector 和变量重命名示例:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int tmp, n;
    cout<<"Input number of elements\n";
    cin >> n;
    vector<int> v;
    for(int i = 0; i < n; ++i)
    {
        cin >> tmp;
        v.push_back(tmp);
    }
    for(auto number: v)
        cout << number << endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    您需要检查是否小于 i 且不小于等于 i。否则它将尝试存储 0,1,2,3 的值,在这种情况下,最后一个对象将导致内存损坏。在 c++ 中,即使您尝试在大小为 3 的数组中添加 100 个成员,它也不会给您任何错误。

    在开始编码之前最好先阅读 C++ 中的内存管理。

    【讨论】:

    • 那么如果大小为3的数组也能包含100个成员,那么size有什么用呢
    • @user8640354 不,大小为 3 的数组不能包含数百个成员。但是,您可以将它们写入数组过去,直到有人注意到它(调试器、操作系统)——这称为undefined behavior
    • 那添加和包含有什么区别。您可以添加,但这将导致 Melebius 描述的未定义行为。调试时您甚至可能不会出错,因为它可能不会损坏任何有价值的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2021-08-05
    相关资源
    最近更新 更多