我正在尝试在C中实现我自己的链接列表结构,但是即使只是在列表中添加新元素的最简单的部分,我也失败了。将一个元素添加到列表并打印它可以正常工作,添加另一个元素并打印它不会。执行后,控制台只输出“内存错误” - 就是这样。我很确定我已经搞乱了insert_list函数中当前指针的迭代,但我无法找到它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 80
typedef struct list
{
struct list *next;
char value[MAXLEN];
} list;
void insert_list(list *lis, const char string[MAXLEN])
{
list *current = lis;
while(current->next)
{
current++;
}
current->next = malloc(sizeof(lis));
strcpy(current->next->value, string);
}
int main(void)
{
list lis =
{
NULL,
"Hello1"
};
insert_list(&lis, "Hello2");
insert_list(&lis, "Hello3");
/* This still works */
printf("%s %s", lis.value, lis.next->value);
/* This doesn't */
printf("%s", lis.next->next->value);
return 0;
}
答案 0 :(得分:3)
current->next->next
永远不会在insert_list
中初始化,因此第二次调用insert_list
时,它可能会永远迭代,直到出现内存错误。
void insert_list(list *lis, const char string[MAXLEN])
{
list *current = lis;
while(current->next)
{
current++;
}
current->next = malloc(sizeof(lis));
current->next->next = NULL;
strcpy(current->next->value, string);
}
实际上还有很多其他错误,而不仅仅是init:
current = current->next
,而不是current++
list
而不是lis
,首先是列表大小中的条目,但sizeof(lis)
将是您计算机上指针的大小const char string[MAXLEN]
作为论据并不代表您认为的含义;-)请参阅Difference between passing array and array pointer into function in C