如果我想在函数中分配内存:
char* allocate() {
char *cp = (char*)malloc(10);
...
return cp;
}
我可以使用从main()
返回的cp
中的内容吗?以及如何释放CCD_ 3?
我可以在main()中使用cp中返回的内容吗?
可以。
以及如何释放cp?
使用
free(cp); // Replace cp with the name of the pointer if you are using it in another function
此外,您不应在C 中投射
malloc
(和族)的结果您应该始终针对malloc(3)的失败进行测试,所以至少要使用perror(3;出口(3)类似:
char *cp = malloc(10);
if (!cp) { perror("malloc"); exit(EXIT_FAILURE); };
一些Linux系统正在启用内存过度使用。这是一个应该禁用的脏功能
如果你正在认真编码(例如,一个供其他人使用的健壮库),你可能需要提供更复杂的内存不足错误恢复(也许有一个约定,每个分配例程都可能在失败时返回NULL
)。YMMV。
实际上,在稍后的某个时刻,您需要使用cp
中的指针调用free(3)。如果你不这样做,你的内存就会泄漏。之后,您不允许使用,即取消引用该指针(注意指针别名)或简单地将其与其他指针进行比较;这将是未定义的行为。
有一个关于何时以及由谁调用free
的约定非常重要。你应该把这个约定记录下来。定义和实施这样的约定并不总是那么容易。
在Linux上,您有非常有用的工具来帮助C动态内存分配:valgrind,将-Wall -Wextra -g
(用于获取所有警告和调试信息)传递给GCC编译器,将-fsanitize=address
传递给最近的gcc
,等等
另请阅读有关垃圾收集的内容;至少为了获得一些术语,比如引用计数。在一些C应用程序中,您稍后可能希望使用Boehm的保守GC。
1。我可以在main()中使用cp中返回的内容吗
可以。动态分配内存(堆上)的作用域和生存期不限于函数作用域。它在free()
d.之前一直有效
注意:始终检查malloc()
是否成功,不要强制转换其返回值
2.以及如何释放cp
使用内存后,可以从main()
或任何其他函数调用free(<pointer>);
,其中<pointer>
是收集allocate()
返回值的变量。