第一次使用C未处理的异常中的列表

时间:2013-04-10 08:19:54

标签: c list exception unhandled

我正在尝试编写一个从用户获取列表的简单程序(列表是带有数据的结构,以及指向下一个列表的指针),然后打印它。 我的代码工作正常,但在打印后,我收到错误“练习4.exe中的0x011e1502处的未处理异常:0xC0000005:访问冲突读取位置0xcdcdcdcd。”

谁能告诉我为什么?这是我的代码:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef int list_data;
typedef struct list
{
    list_data number;
    struct list* next_list;
} list; //definition of a list
list* create_list()
{
    list* anchor;
    anchor=(list*)malloc(sizeof(list));
    anchor->next_list=NULL;
    return anchor; // allocates a memory for a list and returns address of first block
}
list* insert_list(list* current_position,list_data x)
{
    list* temp;
    temp=(list*)malloc(sizeof(list));
    temp->number=x;
    temp->next_list=current_position->next_list;
    current_position->next_list=temp;
    return temp; //inserts a new block with a data of x 
}
void printlist(list* anchor)
{
    list* current_list=anchor->next_list;
    while(current_list!=NULL)
    {
        printf("%3d -> ",current_list->number);
        current_list=current_list->next_list;
    }
    printf("End\n");
}
void scan_list(list* anchor)
{
    int num1=1;
    list* current_position=anchor;
    printf("Enter values until 0\n");
    while(num1!=0)
    {
        scanf("%d",&num1);
        if(num1)
            current_position=insert_list(current_position,num1);
    }
}
void main()
{
    list* anchor;
    anchor=create_list();
    scan_list(anchor);
    printf("\n");
    printlist(anchor);
    free(anchor);
    getch();
}

2 个答案:

答案 0 :(得分:2)

您正在访问由值0xcdcdcdcd表示的单位化内存区域。你不能通过删除第一个元素来简单地free你的列表,而是删除所有元素,遍历你的列表并释放每个节点,因为你会创建一个内存泄漏

void free_list(list* anchor){
    list* temp = anchor->next_list;
    free(anchor);
    while(temp->next_list){
       list* l = temp->next_list;
       free(temp);
       temp = l->next_list;
    }
}

此外,在添加节点并且在函数中有一个奇怪的交叉引用时,将下一个元素显式设置为NULL

list* insert_list(list* current_position,list_data x)
{
    list* temp;
    temp=(list*)malloc(sizeof(list));
    temp->number=x;
    //temp->next_list=current_position->next_list; -> doesn't make sense
    current_position->next_list=temp;
    temp->next_list = NULL; //set to NULL
    return temp; //inserts a new block with a data of x 
}

我认为有四个你没有明确告诉你next项是NULL你正在迭代列表的实际结尾。

答案 1 :(得分:1)

您发布的代码工作正常。它从用户获取值并正确显示它。 我已经使用linux gcc编译了代码并做了一些修改以避免一些警告