从一个在同一个函数上分配了内存的函数返回一个字符串是安全/正确的吗?

时间:2013-07-14 12:49:07

标签: c

我理解如果我想从函数返回字符串文字或数组,我应该将其声明为静态,以便在返回被调用函数时内容不会“死”。

但我的问题是,当我在函数内部使用malloc分配内存时呢?

在以下功能中:

char * getLine() {

    char *line = (char *) malloc(10 * sizeof(char));

    printf("Enter a string: ");
    fgets(line, 10, stdin);

    return line;
}

即使函数getLine返回后,从该函数返回的内存地址仍然是安全的吗?

3 个答案:

答案 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;
}

现在你可以在一个循环或任何匹配你需要的函数中调用这个函数,函数本身只有两个副作用(除了写入内存):写入终端并从中读取。这很好。