char * return_buffer()
{
char buffer[1024];
snprintf(buffer, sizeof(buffer), "%s", "test");
return buffer;
}
缓冲区是在函数中创建的,我可以直接返回缓冲区吗?函数返回后,缓冲区会消失?我可以返回在函数中创建的缓冲区吗?
char * return_buffer()
{
char buffer[1024];
snprintf(buffer, sizeof(buffer), "%s", "test");
return buffer;
}
缓冲区是在函数中创建的,我可以直接返回缓冲区吗?函数返回后,缓冲区会消失?我可以返回在函数中创建的缓冲区吗?
您正在创建一个静态分配的缓冲区,这意味着它正在堆栈上创建。当函数返回时,它会给你一个不再使用的堆栈地址。所以如果你进行更多的函数调用,它存储的数据可能会损坏。
通过调用malloc分配给堆好得多。
请注意,在这种情况下“静态分配”意味着:在编译时分配已知的静态数组大小。不要与关键字“静态”和静态存储持续时间相混淆。 – Lundin
您将需要使用malloc
在堆上分配缓冲区。
buffer
是一个本地/自动变量,并不保证在函数返回后存在。使用超出函数范围的任何此类缓冲区将导致未定义行为。
是的。这个缓冲区是一个使用栈的局部变量,一旦你退出函数就会被释放。使用malloc分配动态内存缓冲区。
在这种情况下,你不能。更喜欢你可以但你应该不这样做。 这里的buffer
被创建在栈上,将被重用。
当您使用malloc
或类似功能进行分配时,您可以返回。
不,你不能返回指向本地变量的指针。
编写这些函数的最好方法是将分配留给调用者。优点是:1)代码独立于内存分配方法,可用于静态和动态分配的内存,2)保持算法和内存分配的独立性,从而使算法仅关注当前的主要任务而不关心与算法本身无关的副作用,例如内存分配。
这种程序设计是非常普遍的(例如它被Windows API使用)。
例子:
void print_buffer (char* buffer, size_t size)
{
snprintf(buffer, size, "%s", "test");
}
[你是正确的(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope )。您需要动态分配一些内存,或者让用户执行该操作并传入缓冲区以供使用。 – chris