2
char * return_buffer()
{
    char buffer[1024];
    snprintf(buffer, sizeof(buffer), "%s", "test");
    return buffer;
}

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

4

6 回答 6

3

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

通过调用 malloc 将其分配到堆中要好得多。

于 2012-10-31T07:05:02.770 回答
1

您将需要使用malloc.
buffer是一个局部/自动变量,在函数返回后不保证存在。在函数范围之外使用任何此类缓冲区将导致未定义行为。

于 2012-10-31T07:03:27.887 回答
0

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

于 2012-10-31T07:03:49.343 回答
0

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

您可以在分配 withmalloc或类似功能时返回。

于 2012-10-31T07:04:06.627 回答
0

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

于 2012-10-31T07:05:17.270 回答
0

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

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

这种程序设计很常见(例如被 Windows API 使用)。

例子:

void print_buffer (char* buffer, size_t size)
{
  snprintf(buffer, size, "%s", "test");
}
于 2012-10-31T07:46:55.747 回答