Динамический массив внутри функции - 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- возврат результата работы функции.