动态数组崩溃超过8个元素

时间:2016-12-14 11:04:43

标签: c++ c arrays dynamic crash

#include<iostream>
using namespace std;
void arrayin(int x[], int n);
void arrayout(int x[], int n);
main()
{
    int n, x[n];
    cout << "Please enter the number of elements in the array: " << endl;
    cin >> n;
    cout << "Please enter the elements: " << endl;
    arrayin(x,n);
    cout << "Array is of " << n << " elements."<< endl;
    cout << "Elements are as follow :" << endl;
    arrayout(x,n); 
}
void arrayin(int x[],int n)
{
    for (int i = 0; i < n; i ++)
    {
        cin >> x[i];
    }
}   
void arrayout(int x[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << x[i] << "\t";
    }
}

我是编程新手。 如果n> 1,则崩溃超过8个元素。 8次崩溃..但是对于n&lt; 8工作正常.. 不知道为什么!

4 个答案:

答案 0 :(得分:5)

问题在于:

 int n, x[n]; // It is undefined behaviour
 cout << "Please enter the number of elements in the array: " << endl;
 cin >> n;

正确的方法是(在编译器上使用variable-size-array扩展名):

 int n;
 cout << "Please enter the number of elements in the array: " << endl;
 cin >> n;
 int x[n];

使用C ++的正确方法是使用std::vector代替:

 int n;
 cout << "Please enter the number of elements in the array: " << endl;
 cin >> n;
 std::vector<int> x(n);

并且您必须进行一些其他更改以适应std::vector

答案 1 :(得分:3)

问题在于:

int n, x[n];  // <-- n is not yet initialized
cout << "Please enter the number of elements in the array: " << endl;
cin >> n;
cout << "Please enter the elements: " << endl;
arrayin(x,n);

你需要这个:

int n;
cout << "Please enter the number of elements in the array: " << endl;
cin >> n;
int x[n];   // << now n has been initialized
cout << "Please enter the elements: " << endl;
arrayin(x,n);
BTW:VLA(或你称之为动态数组)在C ++中是非标准的,但gcc(以及可能的铿锵声)将它们作为扩展名。

答案 2 :(得分:2)

int n, x[n];是问题

您宣布n具有不确定的值。使用此值,您将声明一个具有不确定大小的数组。

您正在使用C ++,因此在用户输入后使用new关键字创建数组:

cout << "Please enter the number of elements in the array: " << endl;
cin >> n;
int *x = new int[n];
// your stuff
delete x;

答案 3 :(得分:0)

在输入n。

之后声明你的数组
#include<iostream>
using namespace std;
void arrayin(int x[], int n);
void arrayout(int x[], int n);
main()
{
    int n;
    cout << "Please enter the number of elements in the array: " << endl;
    cin >> n;
    int x[n];
    cout << "Please enter the elements: " << endl;
    arrayin(x,n);
    cout << "Array is of " << n << " elements."<< endl;
    cout << "Elements are as follow :" << endl;
    arrayout(x,n);
}
void arrayin(int x[],int n)
{
    for (int i = 0; i < n; i ++)
    {
        cin >> x[i];
    }
}
void arrayout(int x[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << x[i] << "\t";
    }
}

此代码有效。问题是当你声明没有n值的数组时,数组将被过去的堆栈中的任何东西初始化。可变长度数组需要该值。所以稍后声明数组。

有人在没有任何理由的情况下投票。

编辑:可变长度数组不是ISO C ++的一部分。要编写符合标准的C ++代码,您应该使用带有g ++或clang的-pedantic标志。

你有两个简单的选择。可以使用std :: array作为固定长度数组,也可以使用std :: vector作为动态数组。