在函数内声明的C自由变量

时间:2013-05-12 10:51:35

标签: c function memory-leaks malloc free

想象一下这段代码:

#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()代码怎么办?

4 个答案:

答案 0 :(得分:3)

您必须free()无论您malloc(),无论何时何地都无关紧要但必须发生以防止内存泄漏。调用free()时,不得再次取消引用指针。

请注意,必须在get_string()之前声明或定义main()

答案 1 :(得分:3)

空闲调用仅适用于动态分配的内存,不适用于静态内存分配

所以,如果有任何动态分配的东西需要释放,当指定的内存块的引用计数达到零时,另一方面必须释放静态分配的内存,程序本身我想没有权利释放静态分配的内存

如果您尝试释放静态内存编译器,理想情况下会在编译时抛出警告,如下所示 警告:尝试释放非堆对象

如果忽略警告,将在免费

时出现一个不错的运行时崩溃

* glibc检测到 ./a.out:free():指针无效: *

永远不要尝试释放非堆对象

答案 2 :(得分:2)

调用者需要确保释放strtemp未动态分配,因此您无法释放它。

答案 3 :(得分:1)

您不需要(不得)释放temp变量,但您需要在str中释放main(因为它是malloc在get_string中的内容