Динамический массив внутри функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Создается динамический массив buff внутри функции.Обязательно ли освобождать память от него (строка 21) в конце функции?Ведь указатель на этот массив является локальной переменной и уничтожается вместе с закрытием функции. А по правилам синтаксиса вроде как надо. Вопрос возник из-за того что данная функция возвращает значение,взятое по указателю на элемент из того самого массива.И если поставить free(buff) то иногда начинает возвращать мусор,т.е. возникает ub.(может ub из-за какой-то ошибки в коде? хотя я не вижу ошибок)
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;
}
И второй вопрос по этой же функции.Если вместо строк 20-22 написать
    return *minimal(buff, x);
то всё работает,но допустимо ли такое по синтаксису?Компилятор не возражает...

Решение задачи: «Динамический массив внутри функции»

textual
Листинг программы
ret = *minimal(buff, x);
free(buff);
return ret;

Объяснение кода листинга программы

  1. buff - динамический массив, выделяемый с помощью функции malloc или calloc.
  2. x - индекс элемента в динамическом массиве buff.
  3. minimal - функция, принимающая два аргумента: динамический массив и индекс элемента.
  4. ret - результат работы функции minimal.
  5. free - функция, освобождающая память, выделенную под динамический массив buff.
  6. return ret - возврат результата работы функции.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы