Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首次使用C中的列表未处理异常_C_List_Exception_Unhandled - Fatal编程技术网

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

首次使用C中的列表未处理异常,c,list,exception,unhandled,C,List,Exception,Unhandled,我正试图编写一个简单的程序,从用户那里获取一个列表(列表是一个包含数据的结构,以及指向下一个列表的指针),然后打印它。 我的代码工作正常,但打印后,我收到一个错误“练习4.exe中0x011e1502处未处理的异常:0xC0000005:访问冲突读取位置0xCDCD。” 谁能告诉我为什么?这是我的密码: #include <stdio.h> #include <conio.h> #include <stdlib.h> typedef int list_data

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

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

#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();
}
#包括
#包括
#包括
typedef int list_数据;
类型定义结构列表
{
列出数据编号;
结构列表*下一个列表;
}名单//清单的定义
列表*创建_列表()
{
列表*锚;
anchor=(列表*)malloc(sizeof(列表));
锚点->下一个\u列表=空;
return-anchor;//为列表分配内存并返回第一个块的地址
}
列表*插入列表(列表*当前位置,列表数据x)
{
列表*临时;
temp=(列表*)malloc(sizeof(列表));
温度->数量=x;
临时->下一个\u列表=当前\u位置->下一个\u列表;
当前职位->下一个职位列表=临时职位;
return temp;//插入数据为x的新块
}
作废打印列表(列表*锚定)
{
列表*当前列表=锚->下一个列表;
while(当前_列表!=NULL)
{
printf(“%3d->”,当前列表->编号);
当前列表=当前列表->下一个列表;
}
printf(“End\n”);
}
无效扫描列表(列表*锚定)
{
int num1=1;
列表*当前位置=锚;
printf(“输入值直到0\n”);
while(num1!=0)
{
scanf(“%d”&num1);
if(num1)
当前位置=插入列表(当前位置,num1);
}
}
void main()
{
列表*锚;
anchor=创建_列表();
扫描列表(锚定);
printf(“\n”);
打印列表(锚);
自由(锚);
getch();
}

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

您正在访问一个统一的内存区域,该区域由值
0xcdcdcd
表示。您不能简单地通过删除第一个元素来释放列表,而是通过删除所有元素、迭代列表并释放每个节点来释放列表,否则会造成内存泄漏

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 
}

我想你没有明确告诉我下一个项是
NULL
你正在迭代列表的实际末尾。

这对我来说很好。你是如何执行的?只有
空闲
ing
anchor
=内存泄漏。另外,如果您可以明确地说明哪一行给出了访问冲突错误,那将是一件好事;给了我一个错误,但它似乎正在工作。一次简单的重启似乎就能解决这个问题。抱歉浪费了您的时间。@OriaGruber,别担心:)