C语言 我正在尝试使用 free() 释放结构中元素占用的内存,但它不起作用



我有这个结构考试。 并且我正在使用清理功能来分配和释放标题占用的内存,但它没有释放它。

    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);
    }
sizeof(strlen(name)+1)不正确

,这为您提供了该计算结果的大小,即 sizeof(int) . 因为您分配了错误的大小,所以您在缓冲区末尾写入时。

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

你的意思是:

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

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

当然,

你的意思很简单:

e->title = strdup(name);
...
free(e->title);

strdup() 将计算由"name"指向的字符串,为副本分配空间(包括空终止符),并以合理的、架构对齐的方式(通常)复制数据。`

我认为Whilom Chime给出了一个相当恰当的答案,Zebra先生也是如此。另一种方法是这样的;

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

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

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

最新更新