пару дней назад начал изучать с++ и столкнулся с такой проблемой. Цель - написать программу по вводу чисел и подсчету их среднего значения. Организовал динамический массив под это дело и в него записываю пользовательский ввод, однако постоянно вылезает ошибка 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;
}
Помогите, пожалуйста, половину гугла перерыл, не нашел решения.
Динамический массив в языке 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;
}
int numbersInArray = 0;
double *input = new double [numbersInArray];
Итак, вы выделили память под... нуль элементов. Отсюда и все неприятности. Представьте, что вам выдали нуль-комнатную квартиру - и куда вы будете завозить мебель? :)
Если уж хотите работать не с готовым вектором, например - то выделяйте память с запасом, чтоб ее хватило. Будучи выделенной, сама по себе память не перераспределяется.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Если функция (FUN_001dd74c) просто выполняется и значение которая она возвращает ни к чему не присваивается это влияет на выполнение дальнейшего...
Время жизни переменных, которые передают в область захвата(в квадратные скобки) лямбды-функции по значению
В общемЕсть задача Так же есть вот такой код размещения '*' Число логически в голове крутится версия проще ( с помощью abs()) Но никак не могу продумать...