Правильно выделить и освободить память - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите,пожалуйста, правильно

выделить

и

освободить

память.

Чтобы не было утечек памяти.

#include <stdio.h>
#include <Windows.h>
#include <locale.h>
#include <time.h>
 
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
 
int main()
{
    setlocale(0, "");
 
    srand(time(NULL));
 
    int **a = NULL;
    int height = 0;
    int width = 0;
    int sort;
    int numb = 0;
    int numb2 = 0;
    int t = 0;
 
    printf("Программа сортировки строк двухмерного динамического массива по возрастанию\n\n");
 
    do
    {
        fflush(stdin);
        printf("1. Задать размерность двухмерного массива\n");
        printf("2. Выбор заполнения массива\n");
        printf("3. Обработка массива\n");
        printf("4. Вывод обработанного массива на экран\n");
        printf("0. Выход и программы\n");
        scanf_s("%d", &numb);
        system("cls");
 
        switch(numb)
        {
        case 1:
            {               
                for ( int i = 0; i < height; i ++ )
                {
                    delete [] a[i];
                }
                delete [] a;
 
                do
                {       
                    fflush(stdin);
                    printf("Введите размерность массива: ");
                    printf("\nШирина:> ");
                    scanf_s("%d", &width);
                    printf("Высота:> ");
                    scanf_s("%d", &height);
                    system("cls");
                }
                while ( height <= 0 || width <= 0);
                
                a = new int * [height];
                
                for ( int i = 0; i < height; i ++ )
                {
                    a[i] = new int [width];
                }
 
                t = 1;
                break;
            }
        case 2:
            {
                if ( t > 0 )
                {
                    for ( int i = 0; i < height; i ++ )
                    {
                        delete [] a[i];
                    }
                    delete [] a;
                    
                    do
                    {
                        fflush(stdin);
                        printf("Выберите:\n 1. С клавиатуры\n 2. Рандомно\n");
                        scanf_s("%d", &numb2);
                        system("cls");
                    }
                    while ( numb2 != 1 && numb2 != 2 );
                    
                    a = new int * [height];
                
                    for ( int i = 0; i < height; i ++ )
                    {
                        a[i] = new int [width];
                    }
 
                    switch (numb2)
                    {
                    case 1:
                        {
                            printf("Заполните массив:\n");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    printf("Введите элемент %d-ой строчки %d-ого столбца: ", i + 1, j + 1);
                                    scanf_s("%d", &a[i][j]);
                                }
                                system("cls");
                            }
                            break;
                        }
                    case 2:
                        {
                            printf("Массив заполнен рандомно");
                            getchar();
                            getchar();
                            system("cls");
 
                            for ( int i = 0; i < height; i ++ )
                            {
                                for( int j = 0; j < width; j ++ )
                                {
                                    a[i][j] = rand() % 50 - 25;
                                }
                            }
                            break;
                        }
                    }
                    t = 2;
                }
                else
                {
                    printf("Задайте размерность массива\n");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 3:
            {
                if ( t == 2 )
                {
                    printf("Вот сам массив:\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
 
                    for ( int j = 0; j < width; j ++ )
                    {
                        for ( int i = 1; i < height; i ++ )
                        {
                            for ( int k = 1; k < height; k ++ )
                            {
                                if ( a[k - 1][j] > a[k][j] )
                                {
                                    sort = a[k - 1][j];
                                    a[k - 1][j] = a[k][j];
                                    a[k][j] = sort;
                                }
                            }
                        }
                    }
                    printf("Массив обработан\n");
                    getchar();
                    system("cls");
                    t = 2;
                }
                else
                {
                    printf("Сделайте предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        case 4:
            {
                if ( t == 2 )
                {
                    printf("Вот обработанный массив\n");
 
                    for ( int i = 0; i < height; i ++ )
                    {
                        for( int j = 0; j < width; j ++ )
                        {
                            printf("%4d", a[i][j]);
                        }
                        printf("\n");
                    }
                    getchar();
                    getchar();
                    system("cls");
                }
                else
                {
                    printf("Сделаете предыдущий шаг");
                    getchar();
                    getchar();
                    system("cls");
                }
                break;
            }
        }
 
    }
    while ( numb != 0 );
    
    _CrtDumpMemoryLeaks();
    
    for ( int i = 0; i < height; i ++ )
    {
        delete [] a[i];
    }
    
    delete [] a;
    
    return 0;
}
Народ,подскажите,пожалуйста.К этой программе мне нужно сделать

промежуточное хранение данных

.Что это вообще такое?

Решение задачи: «Правильно выделить и освободить память»

textual
Листинг программы
int **a = NULL;
 
    a = new int * [height];
                
    for ( int i = 0; i < height; i ++ )
    {
        a[i] = new int [width];
    }

Объяснение кода листинга программы

  1. Объявляется двумерный массив a типа int** и инициализируется значением NULL.
  2. Выделяется память под массив указателей на int с помощью оператора new, где height - размер первого измерения, а width - размер второго измерения.
  3. В цикле for, который выполняется height раз, для каждого элемента массива a[i] выделяется память под массив int с помощью оператора new.
  4. Каждое значение a[i] будет представлять собой массив int, а каждое значение a[i][j] будет представлять собой отдельное целое число.
  5. После выполнения всех операций, необходимо освободить выделенную память с помощью оператора delete.

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


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

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

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