heap corruption detected after normal block c++

126
28 мая 2021, 18:10

пару дней назад начал изучать с++ и столкнулся с такой проблемой. Цель - написать программу по вводу чисел и подсчету их среднего значения. Организовал динамический массив под это дело и в него записываю пользовательский ввод, однако постоянно вылезает ошибка heap corruption detected after normal block. Не понимаю, где вообще расположен неверный участок.

#include <iostream>
int main()
{
    using namespace std;
    int numbersInArray = 0;
    double *input = new double [numbersInArray];
    double test;
    while(numbersInArray < 10)
    {
        cin >> test;
        if (!cin)
            break;
        else
        {
            numbersInArray++;
            input[numbersInArray - 1] = test;
        }
    }
    double average = 0;
    for (int i = 0; i < numbersInArray; i++)
    {
        average += input[i];
    }
    cout << "Average value: " << average/numbersInArray << endl;
    int numbersGreaterThenAverage = 0;
    for (int i = 0; i < numbersInArray; i++)
    {
        if (input[i] > average)
            numbersGreaterThenAverage++;
    }
    cout << "Numbers greater then average: " << numbersGreaterThenAverage << endl;
    delete[] input;
    return 0;
}

Помогите, пожалуйста, половину гугла перерыл, не нашел решения.

Answer 1

Динамический массив в языке C++ имеет два значения: массив переменного размера(т.е. способным к добавлению и удалению в нём элементов) и массив, который мы разместили в куче(heap). В данном случае вы используете второй вид динамического массива, который сам по себе не меняет своих размеров.

Когда мы хотим считать и записать элементы массива, то у нас стоит выбор какой использовать: статический или динамический(1 или 2). Если количество элементов фиксировано(т.е. мы изначально знаем), то под это отлично подойдёт обычный статический массив, а если же количество элементов вводится с клавиатуры, то мы используем динамический, т.к. по стандарту в языке C++ количество элементов в статическом массиве должно быть известно в момент компиляции, никак не исполнения. В вашем случае, как я понял, количество элементов фиксировано и равно 10. Тогда и вовсе динамический массив никак не обязателен.

Распишу решение в 3-х видах: с использованием статического и динамического 1-го и 2-го вида.

Статический(неспособный к растягиванию массив, выделенный в stack):

int main()
{
    constexpr int ARR_SIZE = 10;
     arr[ARR_SIZE];
    for(int i = 0; i < ARR_SIZE; ++i)
        std::cin >> arr[i];
    //обрабатываем элементы массива
    ...
    return 0;
}

Динамический(неспособный к растягиванию массив в heap):

#include <iostream>
#include <vector>
int main()
{
    int numbersInArray;
    std::cout << "Enter number of elements: ";
    std::cin >> numbersInArray;
    double *arr = new double[numbersInArray];
    for(int i = 0; i < numbersInArray; ++i)
        cin >> arr[i];
    //обрабатываем элементы массива
    ...
    return 0;
}

Динамический(cпособный к растягиванию массив, внутри сам выделен в heap):

#include <iostream>
#include <vector>
int main()
{
    std::vector < double > arr;
    int numbersInArray;
    std::cout << "Enter number of elements: ";
    std::cin >> numbersInArray;
    for(int i = 0; i < numbersInArray; ++i)
    {
        double temp_variable;
        cin >> temp_variable;
        arr.push_back(temp_variable);
    }
    //обрабатываем элементы массива
    ...
    return 0;
}
Answer 2
int numbersInArray = 0;
double *input = new double [numbersInArray];

Итак, вы выделили память под... нуль элементов. Отсюда и все неприятности. Представьте, что вам выдали нуль-комнатную квартиру - и куда вы будете завозить мебель? :)

Если уж хотите работать не с готовым вектором, например - то выделяйте память с запасом, чтоб ее хватило. Будучи выделенной, сама по себе память не перераспределяется.

READ ALSO
Вопрос по C или C++ (дизассемблер)

Вопрос по C или C++ (дизассемблер)

Если функция (FUN_001dd74c) просто выполняется и значение которая она возвращает ни к чему не присваивается это влияет на выполнение дальнейшего...

125
Время жизни переменных в лямбде функции?

Время жизни переменных в лямбде функции?

Время жизни переменных, которые передают в область захвата(в квадратные скобки) лямбды-функции по значению

88
задача на симетричное отображений

задача на симетричное отображений

В общемЕсть задача Так же есть вот такой код размещения '*' Число логически в голове крутится версия проще ( с помощью abs()) Но никак не могу продумать...

129