15
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}

函数中的变量是否x必须被释放?如果是这样,当我需要退货时怎么可能?

4

6 回答 6

14

函数中的变量 x 是否必须被释放?

是的(有点,见我后来的评论)。每次调用都malloc需要稍后调用free。否则,您有泄漏。但请记住;您不是“free[ing] x”,而是在释放 x 所指的内存。

当您返回的(地址)的x副本被制作并返回给调用者。 声明了自动存储期限。它所指的内存必须被释放。xx

如果是这样,当我需要退货时怎么可能。

你的设计让调用者有责任释放内存。您已经在 main 中完成了此操作。当然,使用此方法需要您记录函数,以便代码的用户知道他们正在接收动态分配的内存地址。

更好的方法(IMO)是将缓冲区作为输入参数。现在很清楚谁负责管理这个内存(即调用者)。也许我什至不想动态分配它。有了这个设计,这是我的选择。

void f(char *buf, size_t buf_size) {
  strncpy(buf, "abc", buf_size - 1);
  buf[buf_size-1] = '\0';
}

附带说明一下,您应该始终检查malloc. 它可能会失败,在这种情况下将返回一个空指针。此外,sizeof(char)保证符合1标准,因此您可以删除该位并说malloc(n).

于 2012-08-09T22:34:24.190 回答
1

是的,它应该由调用者释放。比如free在你的主要。

当您x在函数中返回时f,地址的副本将传回给调用者。呼叫者可以呼叫free该地址。

于 2012-08-09T22:33:52.057 回答
1

是的,您需要释放,但是当您执行时它已经被释放free(a);main因为在 linea中分配为 equal )。xa = f();

于 2012-08-09T22:35:33.530 回答
1

x退出函数后被销毁。的值x是指向动态分配对象的地址。退出函数后对象仍然存在。

要释放动态对象,您必须将函数x返回的值传递ffree函数。

于 2012-08-09T22:39:42.820 回答
0

当您调用malloc它时,它会分配内存并返回该内存块的初始地址。

在您的情况下,您将此地址返回给被调用者,现在被调用者 main 负责释放它。

释放内存块唯一需要的是初始地址,AFIK 操作系统负责分配/释放内存,它使用相当复杂的算法,但程序只需要跟踪初始内存地址。这个地址可以像任何其他整数值一样被存储或移动,因为在 32 位系统中它只是一个 int 值。

于 2012-08-09T22:39:48.227 回答
0

您的代码运行良好,您释放a了由 f 分配的字符串。

于 2012-08-09T22:40:54.807 回答