程序中的分段错误使用链表

时间:2012-03-14 12:26:27

标签: c

代码:

#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;
}

我尝试使用链接列表编写一个简单的程序来添加和显示数据。但它给我一个分段错误。我希望我已经用内存初始化了所有指针。所有帮助表示赞赏。

4 个答案:

答案 0 :(得分:3)

此:

temp->name = name;

不会将name复制到temp->name,但会将temp->name分配到与name相同的地址,这是该函数的本地地址。您需要malloc()strcpy()

temp->name = malloc(strlen(name) + 1);
strcpy(temp->name, name);

在不再需要时请记住free(temp->name);

此外(正如Luchian所指出的),从stdin阅读时:

char *name;
...
scanf("%s",name);

name没有分配内存。将它声明为一个数组,但你需要防止写入超出它的结尾:

char name[128];
...
scanf("%127s",name);

答案 1 :(得分:2)

你还没有:

char *name;
///....
scanf("%s",name);

您从未为name分配内存。

你可以做char name[50];或其他什么,但要注意溢出。警惕他们。

答案 2 :(得分:1)

hmjd Luchian Grigore 答案都是先前的问题,但也是:

您不会在temp->info之后的任何时候初始化malloc,因此它永远不会NULL,但temp->info是无效的地址。

要么显式初始化它,要么使用calloc来初始化已分配的缓冲区,而不是malloc

答案 3 :(得分:1)

您忘了分配name

     char *name