我可以返回函数中创建的缓冲区吗?

时间:2012-10-31 07:01:22

标签: c

char * return_buffer()
{
    char buffer[1024];
    snprintf(buffer, sizeof(buffer), "%s", "test");
    return buffer;
}
在函数中创建了

缓冲区,我可以直接返回缓冲区吗?函数返回后,缓冲区会消失吗?

6 个答案:

答案 0 :(得分:3)

您正在创建静态分配的缓冲区,这意味着它正在堆栈上创建。当函数返回时,它将为您提供不再使用的堆栈上的地址。因此,如果您进行更多函数调用,它存储的数据可能会损坏。

通过调用malloc将它分配给堆更好。

答案 1 :(得分:1)

您需要使用malloc在堆上分配缓冲区 buffer是一个本地/自动变量,并且在函数返回后不保证存在。使用超出函数作用域的任何此类缓冲区将导致未定义的行为。

答案 2 :(得分:0)

是。此缓冲区是使用堆栈的局部变量,一旦退出函数将被释放。使用malloc分配动态内存缓冲区。

答案 3 :(得分:0)

在这种情况下,不,你不能。更像是可以,但应该不能这样做。 这里buffer是在堆栈上创建的,将被重用。

您可以在使用malloc或类似功能进行分配时返回。

答案 4 :(得分:0)

这是不可能的,可能会导致崩溃。这里内存分配在堆栈上,一旦函数返回内存将被释放。如果要从函数返回缓冲区,则必须在堆上分配内存。你可以使用malloc / calloc。阅读more

答案 5 :(得分:0)

不,你不能返回指向局部变量的指针。

编写此类函数的最佳方法是将分配留给调用者。优点是:1)代码独立于内存分配方法,可以与静态和动态分配的内存一起使用,2)保持算法和内存分配分离,这样算法只关心手头的主要任务并且不关心与算法本身无关的辅助任务,例如内存分配。

这种程序设计非常常见(例如,它由Windows API使用)。

示例:

void print_buffer (char* buffer, size_t size)
{
  snprintf(buffer, size, "%s", "test");
}