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