Ошибка в функции с освобождением памяти - 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, но в данном случае они также отсутствуют.