1

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

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

在以下函数中:

char * getLine() {

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

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

    return line;
}

这个函数返回的内存地址即使在getLine函数返回后仍然是安全的?

4

3 回答 3

4

我知道,如果我想从函数返回字符串文字或数组,我应该将其声明为static

这不完全正确:虽然声明它static会解决问题,但将它分配到动态内存中,即////malloc等。所以答案是“是的,从函数返回 -ed 内存是非常安全的”。当然,接收动态内存的调用者必须在不再需要它时处理它。callocreallocstrdupmallocfree

编辑:(回应评论)事实上,static在某些情况下使用可能会较差,因为缓冲区将保持共享。例如,如果您决定制作用户输入字符串的列表,您将被迫在调用者中制作副本。此外,使用static会使您的函数不可重入,这在并发环境中是有害的。

于 2013-07-14T12:51:17.837 回答
1

是的,但是必须在同一个指针上调用其他东西free,否则内存将保持分配状态,直到进程退出。

于 2013-07-14T12:51:09.600 回答
0

正如其他人所说,返回指向动态分配内存的指针很好。

但是,正如已经说过的,调用者现在必须跟踪何时不再需要该内存并取消分配它。

在这种情况下,让调用者提供要填充的内存通常更明智,因为这解决了内存所有权的问题,并增加了能够用数据填充任何(预)分配的内存块的好处。

因此,您的函数可能如下所示:

char* get_line(char* dst, int size) {
  printf("Enter a string: ");
  fgets(dst, size, stdin);

  return dst;
}

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

于 2013-07-14T13:57:08.790 回答