Ошибка в функции с освобождением памяти - C (СИ)

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

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

Здравствуйте. Столкнулся с такой ошибкой: "C4700 использована неинициализированная локальная переменная "mas"". //при вызове функции fre Предполагаю, что способствует этой ошибке неверная расстановка указателей, но разобраться не могу..( Буду очень благодарен за любую подсказку..
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#include <string>
 
int printMenu();
 
int **memory(int width, int height)
{
    int **mas;
    mas = (int**)malloc(width * sizeof(int*));
    for (int i = 0; i < width; i++)
    {
        mas[i] = (int*)malloc(height * sizeof(int));
    }
 
    return mas;
 
}
void size(int ***mas, int *width, int *height)
{
    do
    {
        printf("Введите размер матрицы:\n");
        scanf_s("%d%d", width, height);
    } while (width <= 0 || height <= 0);
    *mas = memory(*width, *height);
}
 
void fre(int **mas)
{
    free(mas);
}

void rand(int **mas, int width, int height)
{
    srand(time(NULL));
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            mas[i][j] = rand() % 100 - 50;
        }
    }
}
 
void vvod(int **mas, int height, int width)
{
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            printf("mas[%d][%d] = ", i, j);
            scanf_s("%d", &mas[i][j]);
        }
    }
}
void osnov(int **mas, int width, int height)
{
    for (int y = 0; y < width; y++)
    {
        for (int i = 0; i < (width - 1); i++)
        {
            if (mas[i][0] > mas[i + 1][0])
            {
                for (int j = 0; j < height; j++)
                {
                    int x = mas[i][j];
                    mas[i][j] = mas[i + 1][j];
                    mas[i + 1][j] = x;
                }
            }
        }
    }
}
 
void conclusion(int **mas, int height, int width)
{
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            printf("%5d", mas[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    int **mas;
    int height, width, menu = 0;

    setlocale(LC_ALL, "Russian");
 
    do
    {
        int menu = printMenu();
        switch (menu)
        {
 
        case 1:
            fre(mas);
            size(&mas, &width, &height);
            memory(width, height);
            break;
        case 2:
 
            break;
        case 3:
 
            break;
        case 4:
 
            break;
        case 5:
 
            break;
        default:
            printf("Неверный пункт меню.\n");
        }
 
    } while (menu != 0);
}
int printMenu()
{
    printf("1. Размер матрицы (высота, ширина)\n");
    printf("2. Заполнение матрицы случайными числами.\n");
    printf("3. Заполнение матрицы вводом с клавиатуры.\n");
    printf("4. Элементы матрицы.\n");
    printf("5. Обработанная матрица.\n");
    printf("0. Выход из программы.\n");
 
    int m;
    scanf_s("%d", &m);
    system("cls");
 
    return m;
}

Решение задачи: «Ошибка в функции с освобождением памяти»

textual
Листинг программы
// width - число выделенных строк в массиве mas
void fre(int **mas, int width)
{
    if(mas)// Если не NULL то освобождаем память
    {
        for(i = 0; i < width; i++)
            free(mas[i]);
 
        free(mas);
 mas = NULL;
 
    }   
}
 
int main()
{
    //...
    int **mas = NULL;
    //...
}

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

  1. В функции fre определена переменная i типа int, которая инициализируется значением 0.
  2. В функции fre определена переменная mas типа int **, которая проверяется на значение NULL.
  3. Если mas не равно NULL, то выполняется следующий блок кода.
  4. В этом блоке кода для каждой строки массива mas вызывается функция free.
  5. После цикла вызывается функция free для самого массива mas.
  6. Значение mas присваивается NULL.
  7. Если mas равно NULL, то ничего не происходит.
  8. В функции main определена переменная mas типа int **, которая инициализируется значением NULL.
  9. В функции main можно выделить строки кода, которые инициализируют и используют массив mas, но в данном случае они отсутствуют.
  10. В функции main можно выделить строки кода, которые вызывают функцию fre с передачей в нее значения mas и значения width, но в данном случае они также отсутствуют.

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


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

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

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