Свободная выделенная память перед возвратом функции

Я пытаюсь вернуть массив, используя malloc в функции:

char* queueBulkDequeue(queueADT queue, unsigned int size)
{
    unsigned int i;
    char* pElements=(char*)malloc(size * sizeof(char));
    for (i=0; i<size; i++)
    {
        *(pElements+i) = queueDequeue(queue);
    }
    return pElements;
}

Проблема в том, что мне нужно освободить его, потому что размер кучи MCU ограничен. Но я хочу вернуть его, чтобы я не мог освободить его в функции, верно?. Могу ли я освободить выделенную память за пределами функции (где я вызываю функцию). Есть ли какие-либо рекомендации для этого? Заранее благодарю вас!

Ответ 1

Поскольку память, выделенная функцией malloc(), находится в куче, а не в стеке, вы можете получить к ней доступ независимо от того, в какой функции вы находитесь. Если вы хотите передать память, выделенную malloc(), у вас нет другого выбора, кроме освобождения это от звонящего. (в терминах подсчета ссылок это то, что называется передачей права собственности.)

Ответ 2

1) Да, вы можете освободить() память malloc'а вне функции

2) Нет, вы не можете освободить его внутри функции и передать данные вне функции, поэтому вы должны сделать 1) здесь

3) Если вы беспокоитесь о нехватке памяти, вам всегда нужно проверять наличие сбоев в распределении памяти, что вы не можете сделать здесь, что, вероятно, приведет к segfault

Ответ 3

Конечно, вы можете освободить память, выделенную функцией вне этой функции, если вы ее вернете.

Но альтернативой было бы изменить вашу функцию, как показано ниже, где вызывающий абонент выделяет и освобождает память. Это будет встроено в концепцию функции, которая выделяет память, берет на себя ответственность за освобождение памяти.

void queueBulkDequeue(queueADT queue, char *pElements, unsigned int size) 
{     
   unsigned int i;     
   for (i=0; i<size; i++)     
   {         
      *(pElements+i) = queueDequeue(queue);     
   }     
   return; 
} 

//В вызывающем

char *pElements = malloc(size * sizeof(char));
queueBulkDequeue(queue, pElements, size);
//Use pElements
free(pElements);

Ответ 4

Да, вы можете освободить память, выделенную в функции, которую вы вызываете вне функции; это именно то, что вам нужно сделать в этом случае.

Альтернативы включают передачу буфера и его длины в функцию и возврат фактической длины вызывающей стороне, как это делает fgets. Возможно, это не лучшая альтернатива, потому что вызывающие абоненты должны будут вызывать вашу функцию в цикле.

Ответ 5

ВОПРОС - если вы делаете функцию, которая возвращает указатель на массив из 20 комплексных чисел,

после помещения значений в массив при выходе из функции,
если вы наберете return (arrayptr); ? } или вы должны ввести return (arrayptr); free (arrayptr)}