c-分配给参数指针的可用内存



假设我有一个函数

int myfunction(char *s)

在这个函数中,s指向的字符串被操作,而return的值是一个错误代码。

假设传递的指针已经指向malloc()内存。是我的责任(开发库)释放函数顶部的内存,还是库用户的错,因为他们不知道这个函数将调用malloc()或相关函数,并将s设置为指向那里?

通常的合同是执行malloc的人就是执行free的人。

还要考虑的是,所指向的数据可能一开始就没有经过malloc’编辑。可能在堆栈上

如果您不打算修改字符串,则应将其声明为const:

int myfunction(const char *s);

然后很明显,myfunction()不会承担所有权,并尝试解除分配字符串(不能用const指针调用free()),这是典型的方法。

由于被调用的函数不知道字符串是否是动态分配的,因此它承担所有权是没有意义的。

好吧,如果我们看看各种api,我们就会有一个想法。例如,strdup(),其中我们传递const char *s作为参数,strdup()负责分配内存。另一方面,你也会发现函数通常不会负责分配缓冲区,即fgets()(还有更多)。还有一些功能可以同时使用,例如getline()。来自的手册页getline():

  If *lineptr is NULL, then getline() will allocate a buffer for storing the line
  ,which should be freed by the user  program. (In this case, the value in *n is
  ignored.)
  Alternatively,  before  calling  getline(), *lineptr can contain a pointer to a
  malloc(3)-allocated buffer *n bytes in size.

因此,所有的方法都是有效的。你必须坚持的一件事是文档。如果应该正确地实现它(不要忘记考虑各种后果),并让它的用户知道该特定函数的作用。如果你没有提供文档,那是你的错,用户有责任知道这个特定功能是如何工作的。

最新更新