Задача на работу с динамическим массивом. 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>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.267 из 5
Похожие ответы