15

我正在尝试在函数中使用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 的堆大小是有限的。但是我想返回它,所以我不能在函数中释放它,对吧?我可以在函数之外释放分配的内存(我调用函数的地方)吗?有没有这方面的最佳实践?先感谢您!

4

4 回答 4

10

1)是的,您可以在函数外释放()分配的内存

2)不,你不能在函数内部释放它并让数据在函数外部传递,所以你必须在这里做1)

3)如果您担心内存不足,则需要始终检查内存分配是否失败,而您在此处未执行此操作,则可能会导致段错误

于 2012-08-01T04:04:39.317 回答
10

由于 malloc() 分配的内存是在堆上而不是在堆栈上,所以无论你在哪个函数中都可以访问它。如果你想传递 malloc() 的内存,除了释放你别无选择它来自调用者。(在引用计数方面,这就是所谓的所有权转移。)

于 2012-08-01T04:37:35.840 回答
9

当然,只要您返回它,您就可以释放在该函数之外的函数中分配的内存。

但是,另一种方法是修改您的函数,如下所示,调用者仅分配和释放内存。这将符合分配内存的函数负责释放内存的概念。

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);
于 2012-08-01T04:29:56.710 回答
5

是的,您可以释放在函数外调用的函数中分配的内存;这正是您在这种情况下需要做的。

替代方法包括将缓冲区及其长度传递给函数,并将实际长度返回给调用者,方法就是这样fgets做的。这可能不是最好的选择,因为调用者需要循环调用你的函数。

于 2012-08-01T04:04:30.660 回答