链表中第6个插入的分段错误

时间:2016-02-17 14:11:33

标签: c list pointers

我正在创建一个程序,您可以在其中创建链接列表并修改/删除/添加/打印值,但我在测试时遇到了一些错误。 第一个是分段错误11:当你添加第四个值并且所有相等的值(1,1,1,1)时,尝试打印列表会让你遇到段错误,无法弄清楚原因。 第二个错误(目前):有时添加的第6个或第8个值将删除所有其他值,最后两个插入并在尾部放置0。

这是感兴趣的代码部分:

typedef struct list
{
    int value;
    struct list* next_ptr;
}tylist;

int main()
{

    tylist *ptrptr;
    ptrptr = NULL;
    printf("\nI'm going to initialize the list now\n");
    action(choicer(), &ptrptr);
    return 0; 
}   
void insert_at_beg(tylist** ptrptr, int value)
{
    if(*ptrptr != NULL)                             
    {
        tylist* tmp_ptr;
        tmp_ptr = *ptrptr;
        *ptrptr = (tylist*)malloc(sizeof(tylist));
        (*ptrptr)->value = value;
        (*ptrptr)->next_ptr = tmp_ptr;
        free(tmp_ptr);
    }
    else
    {
        printf("\nList is empty, that's your first entry\n");
        *ptrptr = (tylist*)malloc(sizeof(tylist));
        (*ptrptr)->value = value;
        (*ptrptr)->next_ptr = NULL;
    }
void action(int choice, tylist **ptrptr)
{
    switch(choice)
    {
    int value;
    case 1:
        printf("\nValue: ");
        scanf("%d", &value);
        insert_at_beg(ptrptr, value);
        action(choicer(), ptrptr);
        break;


    case 8:
        visit_list(ptrptr);
        action(choicer(), ptrptr);
        break;
    }
}
void visit_list(tylist **ptrptr) 
{
    while((*ptrptr) != NULL)
    {
        printf(" %d", (*ptrptr)->value);
        ptrptr = &((*ptrptr)->next_ptr);
    }
}

我故意删除了一些代码行,因为它似乎只有这么长时间,如果不清楚我会发布更多内容。

P.S。我很抱歉我的英语不好,我正在努力改进它。

1 个答案:

答案 0 :(得分:0)

    tmp_ptr = (tylist *)malloc(sizeof(tylist));
    tmp_ptr = *ptrptr;

你刚刚将sizeof( tylist )泄露在内存中。 (你在复制之后编辑了这个。)

哦,还有don't cast the result of malloc() in C

    (*ptrptr)->next_ptr = tmp_ptr;
    free(tmp_ptr);

您的next_ptr现在指向free()&n;内存。从此处对next_ptr的任何访问权限(如visit_list())都是undefined behaviour

int value;
case 1:
    printf("\nValue: ");
    scanf("%d", &value);

从不使用scanf()来解析用户输入。 (使用fgets()并解析内存。)

如果坚持使用scanf(),至少检查返回代码 - 如果用户确实输入了非数字,此时value可能未初始化。

    return 0; 
}   

完成列表后,我没有看到任何释放内存的代码。在结束程序之前不free()分配的内存是内存泄漏。那就是Windows或Linux恢复该内存,因为它们拆除程序的过程并没有改变你的程序泄露内存的事实。