我试图使用free()释放结构中元素占用的内存,但它不起作用

时间:2015-01-23 11:54:26

标签: c pointers struct malloc free

我有这个结构考试。我正在使用cleanUp函数来分配和释放标题占用的内存,但它没有释放它。

    typedef struct
    {
        char* title;
        Question* questions[MAX_QUESTIONS];
    }Exam;

    BOOL CleanUp(Exam * e){
    char name[200];
        printf("Enter name of the course \n");
        gets(name);
        fflush(stdout);
        e->title = (char*)malloc(sizeof(strlen(name)+1));
        strcpy(e->title,name);

        free(e->title);
    }

3 个答案:

答案 0 :(得分:2)

sizeof(strlen(name)+1)不正确,这会为您提供该计算结果的大小,即sizeof(int)。因为您已经分配了错误的大小,所以您正在写入缓冲区的末尾。

这会破坏数据并导致free()失败。

你的意思是:

sizeof(char) * (strlen(name) + 1)

在C中,sizeof(char)保证为1,所以你实际上并不需要它,但是我已经把它放在那里来说明为多个对象分配内存的一般方法:乘以大小对象数量的对象。

答案 1 :(得分:0)

当然,你的意思是:

e->title = strdup(name);

...

free(e->title);

strdup()将计算&#39; name&#39;指向的字符串,为副本(包括空终止符)分配空间,并以合理的,体系结构对齐的方式复制数据(通常。)`< / p>

答案 2 :(得分:0)

我认为Whilom Chime和Zebra先生一样给出了非常好的回答。另一种方法就是这样;

e->title = malloc(sizeof(char *));

if(e->title != NULL) strcpy(e->title, word);

但是,我发现在使用非常大的数据集时(我必须在几天前将~3M字放入2-3-4树中),e->title = strdup(word);实际上比{{1}更快}}。我不知道为什么,老实说对我来说没有意义,因为strcpy不必经历为字符指针分配内存的过程。也许其他人可以提供这方面的意见