Задача на работу с динамическим массивом. HEAP CORRUPTION DETECTED - C (СИ)
Формулировка задачи:
Не понимаю причину ошибки. Подскажите пожалуйста.
HEAP CORRUPTION DETECTED: after Normal block (#318) at 0x00FE03B0.
CRT detected that the application wrote to memory after end of heap buffer.
// pmArray.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <clocale>
#include <stdlib.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "rus");
//Инициализируем функцию для заполнения массива случайным набором чисел.
srand(time(NULL));
// Указывавем переменные для организации меню и подменю.
int menu = 0;
int menu1 = 0;
int wasEntRM = 0;
int wasEntEM = 0;
int wasCalc = 0;
//Задаем массив и его размер
int size = 0;
int *a = new int[size]();
printf("Выберите пункт меню.\n");
do
{
printf("1. Ввести количество элементов массива.\n");
printf("2. Ввести значение элементов массива.\n");
printf("3. Обработать массив в соответствии с задачей.\n");
printf("4. Вывести результат обработки на экран.\n");
printf("5. Вывести количество четных и нечетных элементов массива.\n");
printf("0. Выход.\n");
scanf("%d", &menu);
// Реализуем меню
switch (menu)
{
case 1:
do
{
printf("Введите размер массива: ");
scanf("%d", &size);
if (size == 0 || size < 0)
{
printf("ОШИБКА!!! Размер массива не может быть равен нулю или быть отрицательным!\n");
}
} while (size == 0 || size < 0);
wasEntRM = 1;
wasEntEM = 0;
wasCalc = 0;
break;
case 2:
if (1 == wasEntRM)
{
printf("1. Ввести значения элементов массива с клавиатуры.\n");
printf("2. Заполнить элементы массива автоматически.\n");
scanf("%d", &menu1);
//Реализуем подменю
switch (menu1)
{
case 1:
for (int i = 0; i < size; i++)
{
printf("Введите элемент №%d: ", i + 1);
scanf("%d", &a[i]);
}
break;
case 2:
for (int i = 0; i < size; i++)
{
a[i] = rand() % 100;
}
break;
}
wasEntEM = 1;
}
else
{
printf("Сначала нужно ввести размер массива!\n");
printf("Выберите пункт меню 1.\n");
}
//Сообщаем пользователю о введенных значениях элемента массива
printf("Введены следующие значения: \n");
for (int i = 0; i < size; i = i + 1)
{
printf("%d", a[i]);
if (i == size - 1)
{
printf("\n");
}
else
{
printf(", ");
}
}
break;
case 3:
if (wasEntEM != 0)
{
for (int i = 2; i < size; i = i + 2) //NB!: Поменять "int i = 2" на "int i = 0" если а[0] нужно считать за четный элемент массива
{
if (a[i] < 0)
{
a[i] = a[i] - (a[i] * 2);
}
else if (a[i] > 0)
{
a[i] = a[i] + (a[i] * (-2));
}
else
{
a[i] = a[i];
}
}
printf("Массив обработан успешно.\n");
wasCalc = 1;
}
else
{
printf("Сначала нужно ввести элементы массива!\n");
printf("Выберите пункт меню 2.\n");
}
break;
case 4:
//Вывод результата изменения знака элемента массива
if (wasCalc != 0)
{
printf("Результат: \n");
for (int i = 0; i < size; i = i + 1)
{
printf("%d", a[i]);
if (i == size - 1)
{
printf("\n");
}
else
{
printf(", ");
}
}
}
else
{
printf("Сначала нужно обработать массив!\n");
printf("Выберите пункт меню 3.\n");
}
break;
case 5:
if (wasCalc != 0)
{
// Задаем переменные для подсчета положительных и отрицательных элементов массива
int aPlus = 0;
int aMinus = 0;
for (int i = 0; i < size; i = i + 1)
{
if (a[i] > 0)
{
aPlus = aPlus + 1;
}
else if (a[i] < 0)
{
aMinus = aMinus + 1;
}
}
printf("Количество положительных элементов массива равно: %d\n", aPlus);
printf("Количество отрицательных элементов массива равно: %d\n", aMinus);
}
else
{
printf("Сначала нужно обработать массив!\n");
printf("Выберите пункт меню 3.\n");
}
break;
case 0:
break;
default:
printf("Неверный пункт меню!\n");
}
} while (menu != 0);
delete [] a;
getchar();
getchar();
return 0;
}Решение задачи: «Задача на работу с динамическим массивом. HEAP CORRUPTION DETECTED»
textual
Листинг программы
#include <locale.h>