2

我正在尝试编写一个简单的程序,从用户那里获取一个列表(一个列表是一个带有数据的结构,以及一个指向下一个列表的指针),然后打印它。我的代码工作正常,但打印后出现错误“练习 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();
}
4

2 回答 2

2

您正在访问一个统一的内存区域,它由 value 表示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您正在迭代列表的实际末尾。

于 2013-04-10T08:27:32.447 回答
1

您发布的代码运行良好。它正在从用户那里获取值并正确显示它。我已经使用 linux gcc 编译了代码并进行了一些修改以避免一些警告

于 2013-04-10T08:24:24.963 回答