我正在尝试使用 free() 释放结构中元素占用的内存,但它不起作用
I am trying to free the memory occupied by an element in the structure using free(), but its not working
我有这个结构考试。我正在使用 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);
}
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' 指向的字符串,分配 space 用于副本(包括空终止符)并以合理的架构对齐方式(通常。 )`
我认为 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 不必经历为字符指针分配内存的过程。也许其他人可以对此提供意见
我有这个结构考试。我正在使用 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);
}
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' 指向的字符串,分配 space 用于副本(包括空终止符)并以合理的架构对齐方式(通常。 )`
我认为 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 不必经历为字符指针分配内存的过程。也许其他人可以对此提供意见