c语言 - 为什么这个链表给出垃圾号码?



我正在尝试编写一个程序来创建链表,当用户输入数字时会更新,并在用户希望终止列表时打印输入的数字。

该程序似乎返回随机数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cs50.h>
int main(void)
{
typedef struct node
{
int number;
struct node *next;
}
node;
int i = 0;
int x;
char v;
node *list = NULL;
node* temp = NULL;
x = get_int("Enter number: n");
list = malloc(sizeof(node));
list -> number = x;
list -> next = NULL;
while(i == 0)
{
x = get_int("Enter number: n");
node *n = malloc(sizeof(node));
temp = malloc(sizeof(node));
n -> number = x;
n -> next = NULL;
for(temp = list; temp->next != NULL; temp = temp -> next)
{
i = 0;
}
temp->next = n;
free(n);
list = temp;
v = get_char("Proceed? :n");
if(v == 'n')
{
break;
}
else if(v == 'y')
{
continue;
}
else return 1;
}
for(node *temp1 = list; temp1 != NULL; temp1 = temp1 -> next)
{
printf("%dn",temp1 -> number);
}
}

cs50头文件允许使用get_函数,而不是使用printfscanf的组合。

我想知道这里出了什么问题。

我将注释答案作为注释放在代码中:

while(i == 0) // advice : since i is always equals to 0, while (1) do the same job
{
x = get_int("Enter number: n");
node *n = malloc(sizeof(node));
temp = malloc(sizeof(node));  // warning : will lead to memory leak since this value is never used
n -> number = x;
n -> next = NULL;
for(temp = list; temp->next != NULL; temp = temp -> next)
{
i = 0; // advice : not really usefull
}
temp->next = n;
free(n); // ERROR : the new node is freed here so its memory may get garbage at any time
list = temp; // ERROR : the begining of the linked list is lost here ; it now always points to the last new node
v = get_char("Proceed? :n");
if(v == 'n')
{
break;
}
else if(v == 'y')
{
continue;
}
else return 1;
}

代码有几个问题

  1. temp = malloc(sizeof(node));会导致内存泄漏,因为您在几行后用list过度写入它
    Sol:实际上您不需要为temp分配内存,因为它仅用于迭代您的列表。

  2. temp->next = n; free(n);存储下一个节点后的free将使n释放分配的内存,但您的temp->next仍然会指向释放的内存,因此您的list和访问是非法<的。>Sol:
    (a) 不要使用free(n)
    (b) 你不需要这个list = temp;, 因为您已经在末尾添加了 node,所以执行list = temp;将从list中删除现有元素。

  3. else return 1;,如果v是其他的,那么ny那么我们返回而不打印列表并释放分配的内存,您不希望这样.
    Sol:更好的办法是从那个点开始,打印listfree内存。

  4. while(i == 0)
    您可以简单地使用while(1),并在不想继续时正确中断。

相关内容

  • 没有找到相关文章

最新更新