我理解如果我想从函数返回字符串文字或数组,我应该将其声明为静态,以便在返回被调用函数时内容不会“死”。
但我的问题是,当我在函数内部使用malloc分配内存时呢?
在以下功能中:
char * getLine() {
char *line = (char *) malloc(10 * sizeof(char));
printf("Enter a string: ");
fgets(line, 10, stdin);
return line;
}
即使函数getLine返回后,从该函数返回的内存地址仍然是安全的吗?
答案 0 :(得分:4)
我理解如果我想从函数返回字符串文字或数组,我应该将其声明为
static
这不完全正确:虽然声明static
会解决问题,但会将其分配到动态内存中,即malloc
/ calloc
/ realloc
/ { {1}} /等。所以答案是“是的,返回strdup
- 来自函数的内存非常安全”。当然,接收动态内存的调用者必须在不再需要它时处理它malloc
。
编辑:(回应评论)实际上,在某些情况下使用free
可能会较差,因为缓冲区将保持共享状态。例如,如果您决定列出用户输入的字符串,则会强制您在调用者中进行复制。此外,使用static
会使您的函数不可重入,这在并发环境中是有害的。
答案 1 :(得分:1)
是的,但是其他东西必须在同一个指针上调用free
,否则内存将保持分配状态,直到进程退出。
答案 2 :(得分:0)
正如其他人所说,返回指向动态分配内存的指针很好。
但是,正如已经说过的那样,调用者现在必须跟踪何时不再需要该内存并解除分配。
在像这样的情况下,让调用者提供要填充的内存通常更明智,因为这解决了内存所有权的问题,并且它增加了能够填充任何(预)分配的内存块的好处与数据。
所以,你的功能可能如下所示:
char* get_line(char* dst, int size) {
printf("Enter a string: ");
fgets(dst, size, stdin);
return dst;
}
现在你可以在一个循环或任何匹配你需要的函数中调用这个函数,函数本身只有两个副作用(除了写入内存):写入终端并从中读取。这很好。