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

时间:2014-10-02 11:18:55

标签: c pointers memory-management malloc dynamic-memory-allocation

假设我有一个功能

int myfunction(char *s)

在此函数中,s指向的字符串被操纵,return值是错误代码。

假设传递的指针已经指向malloc()内存。我是否有责任(开发一个库)在函数顶部释放这个内存,或者是因为不知道这个函数会调用malloc()或者相关并设置{{}而是库用户的错误。 1}}指向那里?

3 个答案:

答案 0 :(得分:2)

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

同时考虑到指向的数据可能首先不是malloc。可能在堆栈上

答案 1 :(得分:1)

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

int myfunction(const char *s);

然后很明显myfunction()不会假设所有权并尝试解除分配字符串(你不能用free()指针调用const)这是典型的方法。< / p>

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

答案 2 :(得分:0)

好吧,如果我们看一下各种apis,那么我们就会有所了解。例如,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.

所以,所有方法都是有效的。你必须要保持的一件事是 文档。如果应该正确实现它(不要忘记考虑各种后果)并让用户知道该特定功能的作用。如果您不提供文档并且用户有责任了解特定功能的工作原理,那么这是您的错。