HEAP CORRUPTION DETECTED - C (СИ) (78860)
Формулировка задачи:
На строчке 36 с очисткой памяти постоянно вылетает ошибка дебага
HEAP CORRUPTION DETECTED after Normal block (#202) at 0x000B6A58
CRT detected that the application wrote to memory after end of heap buffer.
и подсвечивается
в malloc.h
Подскажите, пожалуйста, что не так.
if (__active_heap == __SYSTEM_HEAP) {
return HeapAlloc(_crtheap, 0, size ? size : 1);
}
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>
struct scan_info {
char model[25]; // наименование модели
int price; // цена
double x_size; // горизонтальный размер области сканирования
double y_size; // вертикальный размер области сканирования
int optr; // оптическое разрешение
int grey; // число градаций серого
};
void addStructure(scan_info *, int*);
void main ()
{
setlocale (LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i=0, j=0, n_of_items=0;
scan_info *input_item;
printf ("\nВведите количество записей: ");
scanf ("%d", &n_of_items);
input_item = new scan_info[n_of_items];
if (input_item == NULL) printf ("Ошибка выделения памяти");
addStructure(&input_item[n_of_items], &n_of_items);
for (i=0;i<n_of_items;i++) delete [] input_item;
system ("pause");
}
void addStructure(scan_info *input_item, int *n_of_items)
{
for (int i=0;i<*n_of_items;i++)
{
printf ("\nВвод данных о сканере\n");
fflush(stdin);
printf ("Введите наименование модели сканера: ");
scanf("%s",&input_item[i].model);
fflush(stdin);
printf ("Введите цену модели сканера: ");
scanf("%d", &input_item[i].price);
fflush(stdin);
printf ("Введите горизонтальный размер области сканирования: ");
scanf("%lf", &input_item[i].x_size);
fflush(stdin);
printf ("Введите вертикальный размер области сканирования: ");
scanf("%lf", &input_item[i].y_size);
fflush(stdin);
printf ("Введите оптическое разрешение: ");
scanf("%d", &input_item[i].optr);
fflush(stdin);
printf ("Введите число градаций серого: ");
scanf("%d", &input_item[i].grey);
}
}Решение задачи: «HEAP CORRUPTION DETECTED»
textual
Листинг программы
void main ()
{
setlocale (LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i=0, j=0, n_of_items=0;
scan_info *input_item;
printf ("\nВведите количество записей: ");
scanf ("%d", &n_of_items);
input_item = new scan_info[n_of_items];
if (input_item == NULL) printf ("Ошибка выделения памяти");
addStructure(input_item, &n_of_items);
delete [] input_item;
system ("pause");
}
Объяснение кода листинга программы
- Устанавливаются настройки локали и кодировки консоли на русский язык.
- Объявляются переменные
i,j,n_of_itemsиinput_item. - Пользователю предлагается ввести количество записей.
- Создается массив
input_itemс помощью оператораnew, выделяется память подn_of_itemsэлементов. - Проверяется успешность выделения памяти, если память не может быть выделена, выводится сообщение об ошибке.
- Вызывается функция
addStructureдля заполнения массиваinput_item. - Выделяемая память очищается с помощью оператора
delete. - Выполняется системная команда
pause, чтобы программа не закрылась сразу после вывода.