Отсутствует целое число при печати из массива после определенной длины - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующий код:

#include <iostream>

using namespace std;

int main()
{
    int length = 0;
    int arrA[length];

    cout << "Enter the length : ";
    cin >> length;

    cout << "Enter " << length << " integers for array : ";

    for(int i = 0; i < length; i++)
    {
        cin >> arrA[i];
    }

    cout << "Array A : ";
    for(int i = 0; i < length; i++)
    {
        cout << arrA[i] << " ";
    }
    cout << endl;
}

Приведенное выше требует, чтобы пользователь ввел длину массива, а затем целые числа, которые будут храниться в массиве. Он работает, но при вводе длины 8 и выше печать значения массива неверна.

Работает

Enter the length : 7
Enter 7 integers for array : 7 6 5 4 3 2 1
Array A : 7 6 5 4 3 2 1

Не работает

Enter the length : 8
Enter 8 integers for array : 8 7 6 5 4 3 2 1
Array A : 8

Может быть, проблема с памятью или что-то в этом роде?

Ответы [ 3 ]

2 голосов
/ 11 июля 2020
int length = 0;
int arrA[length];

Это недопустимый C ++. Вы можете сделать следующее:

int *arrA = new int[length];

после cin >> length. Позже вам нужно будет освободить указатель с помощью delete[] arrA;

2 голосов
/ 11 июля 2020
int length = 0;
int arrA[length];

Это создает массив размером ноль

cout << "Enter the length : ";
cin >> length;

Это устанавливает для переменной length значение, введенное пользователем, но не меняет размер arrA который имеет уже был создан .

Очевидно, вы думаете, что при изменении переменной length изменится и массив arrA, но это не так.

Поскольку вы обращаетесь к элементам массива с нулевым размером, поведение вашей программы не определено.

Кроме того, весь этот подход неверен, потому что

int length;
...
int arrA[length];

не юридический C ++. Поскольку length - переменная, это массив переменной длины или VLA. VLA разрешены в C, но не разрешены в C ++.

Лучший способ написать этот код на C ++ - использовать вектор. Вектор - это улучшение C ++ для массива C.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int length;

    cout << "Enter the length : ";
    cin >> length;

    vector<int> arrA(length);
    ...
1 голос
/ 11 июля 2020

Это не из-за проблемы с памятью . А потому, что массивы переменной длины не являются частью стандарта C ++. length - массив переменной длины. Узнать больше о массивах переменной длины Здесь

Вот код, если вы не хотите использовать vector. Я бы посоветовал использовать , а не по разным причинам. Но go вперед и нокаутируйся.

#include <iostream>

using namespace std;

int main()
{
    int length = 0;

    int *arrA = new int [length];

    cout << "Enter the length : ";
    cin >> length;
   
    cout << "Enter " << length << " integers for array : ";

    for (int i = 0; i < length; i++)
    {
        cin >> arrA[i];
        
    }
   

    cout << "Array A : ";
    for (int i = 0; i < length; i++)
    {
        cout << arrA[i] << " ";
    }
    
    delete[] arrA;
    cout << endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...