尝试实现我自己的列表时出现内存错误

时间:2016-02-11 16:20:57

标签: c list struct

我正在尝试在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;
}

1 个答案:

答案 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:

  1. 推进列表,应该是current = current->next,而不是current++
  2. malloc应该是sizeof list而不是lis,首先是列表大小中的条目,但sizeof(lis)将是您计算机上指针的大小
  3. const char string[MAXLEN]作为论据并不代表您认为的含义;-)请参阅Difference between passing array and array pointer into function in C