我试图向用户请求一个单词,然后将其保存在链表中,因为我在循环中。问题是它只打印了我的最后一个单词,而不是我一个接一个介绍的所有单词。我做错了什么?
我的主要内容不完全是这样的,因为我在使用线程后有更多的代码,但我 100% 确定问题出在我发布的代码上。
编辑
typedef struct data_msg msg, *p_msg;
struct data_msg {
char topic[50];
char title[50];
char body[1000];
int duration;
p_msg next;
};
p_msg save_msg(p_msg pm, char topic[50], char title[50], char body[1000]){
p_msg new, aux;
new = malloc(sizeof(msg));
if(new == NULL){
printf("n[ERROR] Memory allocation.");
exit(0);
}
strcpy(new->topic, topic);
strcpy(new->title, title);
strcpy(new->body, body);
new->next = NULL;
if(pm == NULL)
pm = new;
else{
aux = pm;
while(aux->next != NULL)
aux = aux->next;
aux->next = new;
}
free(new);
return pm;
}
int main(){
char topic[50], title[50], body[1000];
p_msg list = NULL;
do{
scanf("%s", topic);
list = save_msg(list, topic, title, body);
} while(strcmp(topic, "exit") != 0);
while(list != NULL){
printf("=> %sn", list->topic);
list = list->next;
}
return 1;
问题是您正在释放仍在使用的内存!
pmessage armazena_msg(pmessage pm, char *topic, char *title, char *company){
pmessage new = malloc(sizeof(message));
// populate this new item, copy things in
// now link into the linked list
if(pm == NULL)
pm = new;
else{
pmessage tmp = pm;
while(tmp->next != NULL)
tmp = tmp->next;
tmp->next = new;
}
// free(new); // BOOM!
return pm;
}
您返回的pm
始终包括您分配和初始化的内存,如果是第一个,则直接输入,或者挂接到列表中,但是当您释放它时,此内存将返回给操作系统。
然后在第二次调用中,很有可能再次返回原始内存 - 这一切都为你设置得很好 - 因此列表最终指向自己。
注释掉free()
,这应该可以按您的预期工作。
编辑可能仍然有一个错误:我相信您应该在将消息链接到列表中之前测试exit
,除非您也想"exit"
字面上添加到列表中。