如果我想在功能中分配内存:
char* allocate() {
char *cp = (char*)malloc(10);
...
return cp;
}
我可以使用cp
main()
中返回的内容吗?以及如何免费cp
?
答案 0 :(得分:5)
我可以在main()中使用cp中返回的内容吗?
是的,你可以。
以及如何释放cp?
使用
free(cp); // Replace cp with the name of the pointer if you are using it in another function
<小时/> 此外,您should not cast the result of
malloc
(and family) in C
答案 1 :(得分:2)
您应始终对malloc(3)的失败进行测试,因此至少使用perror(3)&amp; exit(3)喜欢:
char *cp = malloc(10);
if (!cp) { perror("malloc"); exit(EXIT_FAILURE); };
某些 Linux系统正在启用memory overcommit。这是一个您应该禁用的脏功能。
如果您正在认真编码(例如,一个强大的库供其他人使用),您可能需要提供更复杂的内存不足错误恢复(可能有一个约定,每个分配例程都可以返回NULL
失败)。 YMMV。
的确,稍后您需要使用cp
中的指针调用free(3)。如果你不这样做,你将拥有memory leak。之后你不允许使用即取消引用指针(注意pointer aliases)或简单地将它与其他指针进行比较;它将是undefined behavior。
有一个约定对于何时以及应该致电free
的人来说非常重要。你应该记录那个惯例。定义和实施此类约定并非易事。
在Linux上,您可以使用非常有用的工具来帮助C dynamic memory allocation:valgrind,将-Wall -Wextra -g
(以获取所有警告和调试信息)传递给GCC编译器,传递-fsanitize=address
到最近gcc
等等。
另请阅读garbage collection;至少得到一些术语,比如reference counting。在某些 C应用程序中,您稍后可能希望使用Boehm's conservative GC。
答案 2 :(得分:1)
1。我可以在main()中的cp中使用返回的内容吗?
是的,你可以。动态分配的内存(在堆上)的范围和生命周期不限于函数范围。它仍然有效,直到free()
d。
注意:请务必检查malloc()
和do not cast返回值是否成功。
2。以及如何释放cp?
使用内存,main()
或任何其他功能后,您可以致电free(<pointer>);
,其中<pointer>
是您收集回报的变量价值allocate()
。