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