想象一下这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRSIZE 2048
int main()
{
char *str;
str = get_string();
return 0;
}
char * get_string()
{
char temp[MAXSTRSIZE], *str;
fgets(temp,MAXSTRSIZE,stdin);
str = malloc( sizeof(char) * (strlen(temp) + 1) );
strcpy(str, temp);
return str;
}
我是否需要释放()函数temp
中的get_string
变量?
如果get_string
内有main()
代码怎么办?
答案 0 :(得分:3)
您必须free()
无论您malloc()
,无论何时何地都无关紧要但必须发生以防止内存泄漏。调用free()
时,不得再次取消引用指针。
请注意,必须在get_string()
之前声明或定义main()
。
答案 1 :(得分:3)
空闲调用仅适用于动态分配的内存,不适用于静态内存分配
所以,如果有任何动态分配的东西需要释放,当指定的内存块的引用计数达到零时,另一方面必须释放静态分配的内存,程序本身我想没有权利释放静态分配的内存
如果您尝试释放静态内存编译器,理想情况下会在编译时抛出警告,如下所示 警告:尝试释放非堆对象
如果忽略警告,将在免费
时出现一个不错的运行时崩溃* glibc检测到 ./a.out:free():指针无效: *
永远不要尝试释放非堆对象
答案 2 :(得分:2)
调用者需要确保释放str
。 temp
未动态分配,因此您无法释放它。
答案 3 :(得分:1)
您不需要(不得)释放temp
变量,但您需要在str
中释放main
(因为它是malloc
在get_string中的内容