2012-10-31 74 views
2
char * return_buffer() 
{ 
    char buffer[1024]; 
    snprintf(buffer, sizeof(buffer), "%s", "test"); 
    return buffer; 
} 

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

+0

[你是正确的(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope )。您需要动态分配一些内存,或者让用户执行该操作并传入缓冲区以供使用。 – chris

回答

3

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

通过调用malloc分配给堆好得多。

+2

请注意,在这种情况下“静态分配”意味着:在编译时分配已知的静态数组大小。不要与关键字“静态”和静态存储持续时间相混淆。 – Lundin

1

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

0

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

0

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

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

0

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

+0

它不必崩溃。 – chris

+0

是的。纠正。既然这是非法的,我说它会崩溃。 – CCoder

0

不,你不能返回指向本地变量的指针。

编写这些函数的最好方法是将分配留给调用者。优点是:1)代码独立于内存分配方法,可用于静态和动态分配的内存,2)保持算法和内存分配的独立性,从而使算法仅关注当前的主要任务而不关心与算法本身无关的副作用,例如内存分配。

这种程序设计是非常普遍的(例如它被Windows API使用)。

例子:

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