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