C 用链表分割程序中的错误
代码:C 用链表分割程序中的错误,c,C,代码: #包括 #包括 结构细节{ 字符*名称; 国际贸易编号; 结构细节*信息; }; //添加链接列表 无效添加(结构详细信息**信息,整数编号,字符*名称){ 结构细节*temp=malloc(sizeof(结构细节)); 温度=*信息; if(temp==NULL){ temp=malloc(sizeof(结构细节)); } 否则{ 如果(临时->信息==NULL){ temp->info=malloc(sizeof(结构细节)); 温度=温度->信息; } } 温度->否=否; 临时-
#包括
#包括
结构细节{
字符*名称;
国际贸易编号;
结构细节*信息;
};
//添加链接列表
无效添加(结构详细信息**信息,整数编号,字符*名称){
结构细节*temp=malloc(sizeof(结构细节));
温度=*信息;
if(temp==NULL){
temp=malloc(sizeof(结构细节));
}
否则{
如果(临时->信息==NULL){
temp->info=malloc(sizeof(结构细节));
温度=温度->信息;
}
}
温度->否=否;
临时->名称=名称;
}
//显示链接列表
无效显示(结构详细信息*信息){
while(info!=NULL){
printf(“\n列表为:\n”、“\n否:\t名称:\n”、%d”、%s和链接:%d”、信息->否,信息->名称,信息->信息);
信息=信息->信息;
}
}
//主程序
int main()
{
结构细节*ptr;
字符*名称,ch;
国际贸易编号;
int选择_选项;
ptr=NULL;
printf(“\n***主菜单***\n1.Add Element\n2.Delete Element\n3.Search Element\n4.link List Concatenation\n5.Invert link List\n6.Diplay Elements\n请输入您的选择:(例如:1,2,3,4,5,6)\n”);
scanf(“%d”,选择选项(&U);
做{
开关(选择_选项){
案例1:
printf(“输入no以添加:”);
scanf(“%d”和“否”);
printf(“输入要添加的名称:”);
scanf(“%s”,名称);
添加(&ptr,编号,名称);
打破
案例6:
显示器(ptr);
打破
违约:
printf(“无效选择!”);
打破
}
printf(“您希望继续吗?(是/否):”;
scanf(“%c”和“ch”);
}而(ch='y'| ch='y');
返回0;
}
我正在尝试编写一个简单的程序,使用链表添加和显示数据。但这给了我一个错误。我希望我已经用内存初始化了所有指针。感谢您的帮助。hmjd和吕基安·格里戈尔的回答都是先决问题,但也包括: 在
malloc
之后的任何时候都不会初始化temp->info
,因此它永远不会为NULL
,但temp->info
是无效地址
要么显式初始化它,要么使用初始化分配缓冲区的calloc
,而不是malloc
您没有:
#include<stdio.h>
#include<malloc.h>
struct details{
char *name;
int no;
struct details *info;
};
//ADDING THE LINKED LIST
void add(struct details **info,int no,char * name){
struct details *temp=malloc(sizeof(struct details));
temp = *info;
if(temp == NULL){
temp = malloc(sizeof(struct details));
}
else{
if(temp->info == NULL){
temp->info = malloc(sizeof(struct details));
temp = temp->info;
}
}
temp->no = no;
temp->name = name;
}
//DISPLAYING THE LINKED LIST
void display(struct details *info){
while(info!=NULL){
printf("\nThe List is:\n","\n no: \tname:\n","%d","%s and link:%d",info->no,info->name,info->info);
info = info->info;
}
}
//MAIN PROGRAM
int main()
{
struct details* ptr;
char *name,ch;
int no;
int select_option;
ptr = NULL;
printf("\n ***MAIN MENU*** \n1.Add Element \n2.Delete Element \n3.Search Element \n4.Linked List Concatenation \n5.Invert Linked List \n6.Diplay Elements \n Please Enter your choice:(eg:1,2,3,4,5,6)\n");
scanf("%d",&select_option);
do{
switch(select_option){
case 1:
printf("Enter no to add:");
scanf("%d",&no);
printf("Enter name to add:");
scanf("%s",name);
add(&ptr,no,name);
break;
case 6:
display(ptr);
break;
default:
printf("INVALID CHOICE!");
break;
}
printf("Do u wish to continue?(y/n):");
scanf("%c",&ch);
}while(ch == 'y' || ch == 'y');
return 0;
}
您从未为名称分配内存
你可以做charname[50]代码>或其他,但要小心溢出。警惕它们。这:
char *name;
///....
scanf("%s",name);
不将name
复制到temp->name
,而是将temp->name
分配到与name
相同的地址,该地址是函数的本地地址。您需要malloc()
和strcpy()
:
记住free(temp->name)代码>不再需要时
另外(正如Luchian所指出的),当从stdin
读取时:
temp->name = malloc(strlen(name) + 1);
strcpy(temp->name, name);
name
没有分配给的内存。将其声明为数组,但需要防止写入超出数组末尾的内容:
char *name;
...
scanf("%s",name);
您忘记分配name
char name[128];
...
scanf("%127s",name);
(gdb)运行10开始程序:/home/BETA/linked_List/p1/linked_List 10主菜单1.添加元素2.删除元素3.搜索元素4.链表连接5.反转链表6.显示元素请输入您的选择:(例如:1,2,3,4,5,6)1输入否添加:12输入名称添加:BETA程序接收信号SIGSEGV,分段错误。/lib/libc.so.6中的_IO_vfscanf()中的0x00178d98。调试时,我无法获得正确的信息,这不是调试器的使用方式。找一个能给你演示如何单步执行代码和检查变量的人。谢谢你,我会请人帮我调试程序,因为我记住了这一点。我在处理阵列时会注意到,您可以始终使用strdup
并保存malloc呼叫。@RichardJ.RossIII,是的,但请注意,strdup
不是C标准的一部分。
char name[128];
...
scanf("%127s",name);
char *name