Динамический массив внутри функции - C (СИ)
Формулировка задачи:
Создается динамический массив buff внутри функции.Обязательно ли освобождать память от него (строка 21) в конце функции?Ведь указатель на этот массив является локальной переменной и уничтожается вместе с закрытием функции. А по правилам синтаксиса вроде как надо.
Вопрос возник из-за того что данная функция возвращает значение,взятое по указателю на элемент из того самого массива.И если поставить free(buff) то иногда начинает возвращать мусор,т.е. возникает ub.(может ub из-за какой-то ошибки в коде? хотя я не вижу ошибок)
И второй вопрос по этой же функции.Если вместо строк 20-22 написать
то всё работает,но допустимо ли такое по синтаксису?Компилятор не возражает...
int func(int* a, int n, int x)//находит х-максимум в массиве а длиной n { int *beg, *fin, *min, *buff, *p; if(n == x){ min = minimal(a, n); return *min; } buff = malloc(x * sizeof*buff);//создаем массив размером введенного с клавиатуры "к" для хранения максимумов if(!buff){ fprintf(stderr, "Error memory allocate!"); exit(1); } for(beg = a, fin = a + x, p = buff; beg < fin; beg++)//заполняем его первыми числами исходного массива *p++ = *beg; for(fin = a + n; beg < fin; beg++){ min = minimal(buff, x); if(*beg > *min) //если среди оставшихся чисел есть большее чем минимальное в массиве buff *min = *beg;//записываем его туда } min = minimal(buff, x);//в уже откорректированном массиве максимумов находим меньший из них,это и будет искомое значение //free(buff); return *min; } int* minimal(int* a, int n)//находит минимальное значение в одномерном массиве и возвращает указатель на него { int *last, *min; for(min = a, last = a + n, ++a; a < last; a++){ if(*a < *min) min = a; } return min; }
return *minimal(buff, x);
Решение задачи: «Динамический массив внутри функции»
textual
Листинг программы
ret = *minimal(buff, x); free(buff); return ret;
Объяснение кода листинга программы
buff
- динамический массив, выделяемый с помощью функцииmalloc
илиcalloc
.x
- индекс элемента в динамическом массивеbuff
.minimal
- функция, принимающая два аргумента: динамический массив и индекс элемента.ret
- результат работы функцииminimal
.free
- функция, освобождающая память, выделенную под динамический массивbuff
.return ret
- возврат результата работы функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д