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

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

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

Создается динамический массив buff внутри функции.Обязательно ли освобождать память от него (строка 21) в конце функции?Ведь указатель на этот массив является локальной переменной и уничтожается вместе с закрытием функции. А по правилам синтаксиса вроде как надо. Вопрос возник из-за того что данная функция возвращает значение,взятое по указателю на элемент из того самого массива.И если поставить free(buff) то иногда начинает возвращать мусор,т.е. возникает ub.(может ub из-за какой-то ошибки в коде? хотя я не вижу ошибок)
Листинг программы
  1. int func(int* a, int n, int x)//находит х-максимум в массиве а длиной n
  2. {
  3. int *beg, *fin, *min, *buff, *p;
  4. if(n == x){
  5. min = minimal(a, n);
  6. return *min;
  7. }
  8. buff = malloc(x * sizeof*buff);//создаем массив размером введенного с клавиатуры "к" для хранения максимумов
  9. if(!buff){
  10. fprintf(stderr, "Error memory allocate!");
  11. exit(1);
  12. }
  13. for(beg = a, fin = a + x, p = buff; beg < fin; beg++)//заполняем его первыми числами исходного массива
  14. *p++ = *beg;
  15. for(fin = a + n; beg < fin; beg++){
  16. min = minimal(buff, x);
  17. if(*beg > *min) //если среди оставшихся чисел есть большее чем минимальное в массиве buff
  18. *min = *beg;//записываем его туда
  19. }
  20. min = minimal(buff, x);//в уже откорректированном массиве максимумов находим меньший из них,это и будет искомое значение
  21. //free(buff);
  22. return *min;
  23. }
  24. int* minimal(int* a, int n)//находит минимальное значение в одномерном массиве и возвращает указатель на него
  25. {
  26. int *last, *min;
  27. for(min = a, last = a + n, ++a; a < last; a++){
  28. if(*a < *min)
  29. min = a;
  30. }
  31. return min;
  32. }
И второй вопрос по этой же функции.Если вместо строк 20-22 написать
Листинг программы
  1. return *minimal(buff, x);
то всё работает,но допустимо ли такое по синтаксису?Компилятор не возражает...

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

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

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

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

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


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

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

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы