我在C中有一个函数,它将一个新问题添加到单链表的头部:
int AddQuestion()
{
unsigned int aCount = 0;
Question* tempQuestion = malloc(sizeof(Question));
tempQuestion->text = malloc(500);
fflush(stdin);
printf("Add a new question.\n");
printf("Please enter the question text below:\n");
fgets(tempQuestion->text, 500, stdin);
printf("\n");
fflush(stdin);
printf("How many answers are there?: ");
scanf("%u", &tempQuestion->numAnswers);
fflush(stdin);
tempQuestion->answers = malloc(sizeof(Answer*) * tempQuestion->numAnswers);
for (aCount = 0; aCount < tempQuestion->numAnswers; aCount++)
{
tempQuestion->answers[aCount] = malloc(sizeof(Answer));
tempQuestion->answers[aCount]->content = malloc(250);
printf("Enter answer #%d: \n", (aCount + 1));
fgets(tempQuestion->answers[aCount]->content, 250, stdin);
fflush(stdin);
printf("Is it correct or wrong? correct = 1, wrong = 0: ");
scanf("%u", &tempQuestion->answers[aCount]->status);
fflush(stdin);
}
tempQuestion->pNext = exam.phead;
exam.phead = tempQuestion;
printf("\n");
fflush(stdin);
return 1;
}
如您所见,我使用malloc()来分配新问题所需的空间。但是,如果我尝试在tempQuestion上调用free(),它会从考试中删除问题。除非问题被删除或程序终止,否则我不想删除该问题。
我有一个清理函数应该释放()所有使用过的内存,但它不会释放addQuestion()函数中的tempQuestion。
void CleanUp()
{
unsigned int i = 0;
Question* tempQuestion = NULL;
if (exam.phead != NULL) {
while (exam.phead->pNext != NULL) {
tempQuestion = exam.phead;
exam.phead = tempQuestion->pNext;
for (i = 0; i < tempQuestion->numAnswers; i++) {
free(tempQuestion->answers[i]->content);
free(tempQuestion->answers[i]);
}
free(tempQuestion->pNext);
free(tempQuestion->text);
free(tempQuestion);
}
free(exam.phead);
}
}
我如何在addQuestion()函数中释放()tempQuestion,以便它只在执行结束时释放内存?我正在使用Visual Studio C ++ 2012,但我必须只使用C语法(没有C ++)编写。我也是C编程的新手。谢谢!
答案 0 :(得分:1)
回答你的问题:你没有。您不应该在free(tempQuestion)
函数中调用AddQuestion
,因为这会释放您刚刚分配的内存。
当你指向另一个指针的指针时,它只会被复制的指针,而不是指向的指针。
答案 1 :(得分:0)
在main中为 tempQuestion 分配和释放内存,而不是在AddQuestion函数中分配。
int main ()
{
Question *tempQuestion = malloc (sizeof (Question));
.
.
.
free (tempQuestion);
return 0;
}
这将帮助您在从main返回之前释放 tempQuestion 的内存。
同时在为 tempQuestion-&gt;回答取消分配内存时,你错过了这个
for (i = 0; i < tempQuestion->numAnswers; i++) {
free(tempQuestion->answers[i]->content);
free(tempQuestion->answers[i]);
}
free (tempQuestion->answer);
休息应该没问题。
答案 2 :(得分:0)
在AddQuestion()
tempQuestion
的末尾指向exam.phead
指向的同一地址,因此CleanUp()
为您释放内存。