Ошибка в функции с освобождением памяти - 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;
- //...
- }
Объяснение кода листинга программы
- В функции
fre
определена переменнаяi
типаint
, которая инициализируется значением 0. - В функции
fre
определена переменнаяmas
типаint **
, которая проверяется на значение NULL. - Если
mas
не равно NULL, то выполняется следующий блок кода. - В этом блоке кода для каждой строки массива
mas
вызывается функцияfree
. - После цикла вызывается функция
free
для самого массиваmas
. - Значение
mas
присваивается NULL. - Если
mas
равно NULL, то ничего не происходит. - В функции
main
определена переменнаяmas
типаint **
, которая инициализируется значением NULL. - В функции
main
можно выделить строки кода, которые инициализируют и используют массивmas
, но в данном случае они отсутствуют. - В функции
main
можно выделить строки кода, которые вызывают функциюfre
с передачей в нее значенияmas
и значенияwidth
, но в данном случае они также отсутствуют.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д