3

想象一下这段代码:

#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;
}

我需要 free()temp函数中的变量get_string吗?如果get_string里面的代码main()呢?

4

4 回答 4

4

免费调用仅适用于动态分配的内存,不适用于静态内存分配

因此,如果有任何使用 malloc/calloc 动态分配的东西需要在指定内存块的引用计数达到零时被释放,另一方面,静态分配的内存根本不能被释放,我想程序本身会无权释放静态分配的内存

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

以防万一,警告被忽略的地方会免费出现一个很好的运行时崩溃

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

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

于 2013-05-12T16:42:28.603 回答
3

调用者需要确保str被释放。temp不是动态分配的,所以你不能释放它。

于 2013-05-12T10:55:18.223 回答
3

free()无论何时何地,您都必须malloc()这样做,但必须发生以防止内存泄漏。当free()被调用时,指针不能被再次取消引用。

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

于 2013-05-12T10:55:52.140 回答
2

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

于 2013-05-12T10:55:48.853 回答