2013-08-28 5 views
0

Я попытался помочь другу с кодом в C++. Я писал:Код вызывает ошибку сегментации

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 

struct list* createlist(FILE *m); 
struct list 
{ 
    char *data; 
    struct list *next; 
}list; 

main() 
{ 

    char a[100], ch; 
    struct list* obj; 
    cout<<"Enter the name of the file for obtaining input.."<<endl; 
    cin>>a; 
    FILE *in; 

    in=fopen(a,"r"); 
    if(in!=NULL) 
    { 

     ch=fgetc(in); 
     if(ch=='1') 
     obj=createlist(in); 
     fclose(in); 
    } 
    return 0; 
} 

struct list* createlist(FILE *m) 
{ 
    cout<<"Entered createlist function..!"<<endl; 
    char *tempStr = (char *)malloc(30 * sizeof(char)); 
    struct list *curr, *head = (struct list *)malloc(sizeof(struct list)); 
    curr = head; 
    curr->data = tempStr; 
    char c; 
    int i=0; 
    curr=NULL; 
    while(EOF!=(c=fgetc(m))) 
     { 
      if((c==' ') || (c=='\0') || i == 29) 
      { 
       if(i==0) 
       { 
        continue; 
       } 
       tempStr[i]='\0'; 
       i=0; 
       struct list *temp = curr; 
       curr = (struct list *)malloc(sizeof(struct list)); 
       temp->next = curr; 
       tempStr = (char *)malloc(30 * sizeof(char)); 
       curr->data = tempStr; 
       continue; 
      } 

      tempStr[i]=c; 
      i++; 
     } 
    return head; 
} 

Но исключение кода. Я пытался понять, что пошло не так, и изменить код на 2-3 часа, и я не мог понять. Я выделить пространство для элемента списка, но когда я пытаюсь присвоить значение next на линии

temp->next = curr; 

Я получаю ошибку сегментации.

В конце мне удалось решить, взяв некоторый код из сети вместо шахты:

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 

struct list* createlist(FILE *m); 
struct list 
{ 
    char *data; 
    struct list *next; 
}list; 

main() 
{ 

    char a[100], ch; 
    struct list* obj; 
    cout<<"Enter the name of the file for obtaining input.."<<endl; 
    cin>>a; 
    FILE *in; 

    in=fopen(a,"r"); 
    if(in!=NULL) 
    { 

     ch=fgetc(in); 
     if(ch=='1') 
     obj=createlist(in); 
     fclose(in); 
    } 
    return 0; 
} 

struct list* createlist(FILE *m) 
{ 
    cout<<"Entered createlist function..!"<<endl; 
    char *tempStr = (char *)malloc(30 * sizeof(char)); 
    struct list *curr, *head = (struct list *)malloc(sizeof(struct list)); 
    curr = head; 
    curr->data = tempStr; 
    char c; 
    int i=0; 
    curr=NULL; 
    while(EOF!=(c=fgetc(m))) 
     { 
      if((c==' ') || (c=='\0') || i == 29) 
      { 
       if(i==0) 
       { 
        continue; 
       } 
       tempStr[i]='\0'; 
       i=0; 
       struct list *temp = curr; 
       curr = (struct list *)malloc(sizeof(struct list)); 
       temp->next = curr; 
       tempStr = (char *)malloc(30 * sizeof(char)); 
       curr->data = tempStr; 
       continue; 
      } 

      tempStr[i]=c; 
      i++; 
     } 
    return head; 
} 

Но я до сих пор не знаю, что пошло не так в моем коде. Может ли кто-нибудь помочь мне понять, поэтому я не буду повторять свою ошибку в будущем?

+0

Если вы пытаетесь узнать, вы должны использовать список, который уже существует в стандартной библиотеке. Если вы пытаетесь учиться, я бы порекомендовал попробовать научиться внедрению такого же общего, как и стандартное. –

+0

Пожалуйста, решите, хотите ли вы использовать C или C++. Вы пишете C с небольшим количеством синтаксиса C++. Таким образом, вы не будете знать C (у вас есть синтаксис, который не является C), и вы также не будете знать подходящий современный стиль C++. –

ответ

1

проблемой является вы

curr=NULL; 

только прежде, чем он в то время как петля

4

Две версии идентичны, насколько я могу видеть, но ошибку легко понять. Вот ваш код с некоторыми комментариями

// at this point curr is NULL (see start of while loop) 

struct list *temp = curr; 
// so now temp is NULL 

curr = (struct list *)malloc(sizeof(struct list)); 
// now curr is pointing at some memory, but temp is still NULL 

temp->next = curr; 
// temp is NULL so this crashes 

Как и все остальные, я думаю, что если вы удалите curr = NULL; вы будете ближе.

3

Ваш 'Темп' является NULL:

curr=NULL; 

После:

struct list *temp = curr; 

И наконец:

temp->next = curr; 

Вы пытаетесь использовать указатель на структуру, которая имеет значение NULL.

Я знаю, что это не поможет вам, но я вижу несколько других проблем с кодом, и это непросто читать.

Поскольку вы отметили этот C++, вы использовали один из контейнеров std? Как std :: list?

3

Перед время цикла, вы назначаете NULL в Curr

curr=NULL; 

Затем вы назначаете Curr для температуры

struct list *temp = curr; 

Затем, когда вы делаете

temp->next = curr; 

вы получите ошибка сегментации, поскольку NULL не имеет следующего указателя.

Если вы удалите curr=NULL;, вы должны быть в порядке.

Смежные вопросы