首次使用C中的列表未处理异常
我正试图编写一个简单的程序,从用户那里获取一个列表(列表是一个包含数据的结构,以及指向下一个列表的指针),然后打印它。 我的代码工作正常,但打印后,我收到一个错误“练习4.exe中0x011e1502处未处理的异常:0xC0000005:访问冲突读取位置0xCDCD。” 谁能告诉我为什么?这是我的密码:首次使用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
#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
你正在迭代列表的实际末尾。这对我来说很好。你是如何执行的?只有空闲inganchor
=内存泄漏。另外,如果您可以明确地说明哪一行给出了访问冲突错误,那将是一件好事;给了我一个错误,但它似乎正在工作。一次简单的重启似乎就能解决这个问题。抱歉浪费了您的时间。@OriaGruber,别担心:)