2015-12-06 4 views
0

Я пытаюсь вернуть указатель на связанный список на main, чтобы я мог передать его другим функциям. В любое время Я пытаюсь получить нагрузку, чтобы передать что-либо сбой программы, и он испортил выход файла. Я просто не могу понять, почему.Ошибка программы при попытке вернуть указатель на связанный список

#include <stdio.h> 
#include <stdlib.h> 

struct list{    //creating linked list 
char furn[128]; 
int priority; 
struct list *next; 
      }; 
typedef struct list List; //typedef for list 
       //creating pointer for head of list 

List **Load(); 
int main(List **points) 

{ 
    points->Load();    //crashes here no if I try to set Load to anything, works fine and prints okay if I don't 





} 
List ** Load() 

{ List *head; 
    List *current;      //so we can build and navigate list 
    List *new; 
    FILE *fin, *fout;      //so that we can start file manipulation 
    char name[]= "California.txt" ; 
    fin=fopen(name, "r"); 
    new=malloc((sizeof(List))); //creating list 
    head=new; 
while(current->next!=NULL) 
    { 
     current=new; 
     new=malloc((sizeof(List))); 
     fscanf(fin,"%s %d",current->furn,&current->priority); //reading and populating list 
     current->next=new; 


    if(feof(fin)) 
     current->next=NULL; 

    } 
    current=head; 
    printf("%s %d",current->furn,current->priority); 
while(current->next!=NULL) 
    { 
     printf("Starting"); 
     printf("%s %d",current->furn,current->priority); 
     current=current->next; 
    } 
    List **points=&head; 
    return points; //Returning so we can have a pointer to the list 

    } 
+5

Я не действительно в C, но 'int main (List ** points)' работает? – pzaenger

+0

Переменная точек выходит за пределы области действия и получает выделение при выходе из метода. Вы не можете вернуть его. – nicomp

+0

'points-> Load();' не следует даже компилировать, независимо от того, насколько разрешительны настройки вашего компилятора. Это не C (это тоже не C++). Если он каким-то образом скомпилируется, авария, скорее всего, связана с тем, что 'points->' пытается разыменовать целое число «1» (или аналогичное небольшое число, которое не является допустимым адресом), поскольку первый аргумент 'main' небольшое целое на любой нормальной ОС. – Leushenko

ответ

1
int main(List **points) 

не работает. Оно должно быть:

int main(int argc, char *argv[]) 

main(int argc, char *argv[]) См или What should main() return in C and C++? для более подробной информации.

points->Load(); 

не работает - если ваша функция Load возвращает указатель, то он должен быть:

points=Load(); 

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

+0

Это подходящее время для объяснения при распределении памяти, у вас есть две обязанности (1) сохранение указателя на начальный адрес для выделенного блока памяти, поэтому (2) он может быть освобожден, когда он больше не используется. В связанном списке вы ожидаете увидеть распределение с каждым созданием узла, поэтому 'malloc' в цикле отлично, но вам нужно правильно управлять указателями, чтобы гарантировать, что вы не нарушаете правило (1). Вот где ошибки начинаются в коде выше. –

+0

Это, безусловно, охватывает некоторые ключевые моменты, хотя далеко не все. –

+0

хорошо, даже если я меняю очки = Load(); это дает мне ошибку. Когда он печатает в Load после того, как я установил его равным, я получаю случайные переменные адреса вместо строк и целых чисел. – lizardbrush

0

Я понял ответ. Я не выделял память в главном, поэтому что-то происходило с ней, когда я пытался передать указатель. После того как я выделил его в основном , мне удалось создать двойной указатель, указывающий на адрес первого указателя , а затем передать его. Манипулирование связанным списком путем разыменования мой двойной указатель (* указатель) -> элемент. Спасибо за помощь, я получил эту идею отсюда.

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