Почему в этот динамический массив выдается исключение? - PullRequest
0 голосов
/ 19 января 2019

Мне трудно понять, почему выбрасывается это исключение. Я выделил массив для получения 100 значений типа int и хочу сохранить в массиве все нечетные числа до 200 (которые должны быть 100 целочисленных значений). Я пытаюсь понять, почему мой код не работает.

Я вызвал мою функцию для выделения массива из 100 значений int. После этого я создал цикл for для перебора и сохранения целых чисел в массиве, однако я создал оператор if для хранения только нечетных чисел. Что я не могу понять, так это если я установлю свой счетчик на 200 и использую оператор if, будет выдано исключение, но если я не вставлю свой оператор if, а только поставлю свой счетчик на 100, все числа между 1-100 сохраненными и исключение не будет выброшено.

Единственное, о чем я могу думать, это вызывает то, что мой счетчик равен 200, и у меня есть оператор if, чтобы перехватить все нечетные числа, так или иначе все числа до 200 сохраняются в массиве, вызывая исключение.

int *allocIntArray(int);

int main() {
    int *a;
a = allocIntArray(100);
for (int count = 1; count < 200; count++) {
    if (a[count] % 2 == 1) {
        a[count] = count;
        cout << a[count] << endl;
    }
}
delete[] a;
return 0;
}
int *allocIntArray(int size) {
int *newarray = new int[size]();
return newarray;
}

Когда я смотрю на вывод программы, он отображает только нечетные числа, но выдается исключение. Это говорит мне, что мое заявление if работает, но что-то запутано.

Чего мне не хватает?

Спасибо за ваше время и знания.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Проблема не в том, сколько номеров вы храните, а в том, где вы их храните;вы храните 101 в a[101], что явно неправильно.

Если i: th нечетное число - C, правильный индекс - i-1, а не C.

Наиболее читаемым изменением, вероятно, является введение новой переменной счетчика.

int main() {
    int a[100] = {0}; 
    int count = 0;
    for (int number = 1; number < 200; number++) {
        if (number % 2 == 1) {
            a[count] = number;
            count += 1; 
       }
    }
}

Я думаю, что преобразование этого из задачи поиска в проблему генерации облегчает получение правильных ответов.

Если вам случится вспомнить, что каждое нечетное число C может быть записано наформа 2 * A + 1 для некоторого A, вы увидите, что искомая последовательность:

2*0+1, 2*1+1, 2*2+1, ..., 2*99+1

, поэтому

int main()
{
    int numbers[100] = {0};
    for (int i = 0; i < 100; i++)
    {
        numbers[i] = 2 * i + 1;
    }
}

Вы также можете пойти другим путемвокруг, перебирая нечетные числа и сохраняя их в нужном месте:

int main()
{
    int numbers[100] = {0};
    for (int i = 1; i < 200; i += 2) // This loops over the odd numbers.
    {
        numbers[i/2] = i;  // Integer division makes this work.
    }
}
0 голосов
/ 19 января 2019

Причина ошибки

Если у вас есть массив a, созданный с элементами n, то при попытке доступа к элементу массива из облаков это неопределенное поведение.Таким образом, индекс ДОЛЖЕН всегда быть между 0 и n-1.

Таким образом, поведение вашей программы не определено, как только count равно 100, так как при оценке условия в if -классе уже пытаются получить доступ за пределами.

Корректировка, которая делает то, что вы хотите

Теперь, кроме того, есть серьезная ошибка в логике вашей программы: если вы хотите добавить числа, которые удовлетворяют некоторому условию, вам нужно 2 счетчика:один для итерации по числам и один для последнего индекса, используемого в массиве:

for (int nextitem=0, count = 1; count < 200; count++) {
    if (count % 2 == 1) {   // not a[count], you need to test number itself
        a[nextitem++] = count;
        cout << count << endl;
        if (nextitem == 100) {    // attention:  hard numbers should be avoided
            cout << "Array full: " << nextitem << " items reached at " << count <<endl;
            break;   // exit the for loop
        }
    }
} 

Но, это решение требует, чтобы вы отслеживали последний элемент в массиве и размер массива(это жестко запрограммировано здесь).

Векторы

Вы, вероятно, учитесь.Но в C ++ лучшим решением было бы использовать vector вместо массива и использовать push_back().Векторы управляют памятью, так что вы можете сосредоточиться на своем алгоритме.Полная программа будет выглядеть так:

vector<int> a;
for (int count = 1; count < 200; count++) {
    if (count % 2 == 1) {
        a.push_back(count);
        cout << count << endl;
    }
}
cout << "Added " << a.size() << " elements" <<endl; 
cout << "10th element: "<< a[9] << endl; 
...