2013-11-20 7 views
0

Добрый день всем,Вызов функции в C & указатель на структуру

я начинаю программировать на C и, может быть, мой вопрос может показаться глупым, но есть какие-либо условия, которые предотвратили бы метод от исполнения?

Теперь я пишу программу, которая использует связанную структуру списка, и каждая вещь компилируется, но после того, как одна определенная строка в программе кода не вызывает методы. Вот мой код:

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

typedef struct node 
{ 
     char* toFrom; 
     char* meanOfTr; 
     int hours; 
     int min; 
     double price; 
     char* note; 
     struct node *next; 
}travel; 

typedef struct list 
{ 
    travel * head; 

}list_t; 

void add(list_t *list,char toFrom1[], char meanOfTr1[], char note1[],int hours1,int min1,double price1); 
void test(); 

int main(void) { 

    list_t *list; 
    test(); 
    list->head=NULL; 
    test(); 
    char* a="London";//then b,c,h,m,p variables declarations and initialization,which doesn't matter 

    add(list,a,b,c,h,m,p); 

    return 0; 
} 
void test() 
{ 
    printf("test\n"); 
} 


void add(list_t *list,char *toFrom1, char* meanOfTr1, char* note1,int hours1,int min1,double price1) 
{ 

    // Some code here 

} 

Я использую метод испытания, который печатает «тест», чтобы проверить, если программа читает этот метод. Но почему-то после строки «list-> head = NULL;» Программа ничего не печатает => не вызывает метод

Если кто-то может объяснить мне, почему это происходит, я был бы очень благодарен. Thanx заранее

EDIT: Я на самом деле решить проблему: проблема заключалась в том, что точка указатель техника его подводит к реальному объекту, так , когда я добавил

list_t l; 
    list_t *list = &l; 

она работала, надеюсь, это поможет кому-то с той же глупой проблемой (: Спасибо за комментарии я буду иметь в виду все

+1

Что касается вашего редактирования, не делайте этого. Это тоже неопределенное поведение! Как только функция выходит из области видимости, память больше не доступна, вы должны положить ее в кучу через Malloc! –

ответ

4
int main(void) { 

    list_t *list; 
    test(); 
    //De-referencing a dangling pointer 
    list->head=NULL; 
    test(); 

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

Поскольку вы, вероятно, новый -с, я объясню немного futher:

list_t *list не выделяет память, все это делает выделяет место на стеке, чтобы сохранить расположение выделенной памяти. Таким образом, в более широком смысле *list укажет на место, в котором достаточно места для хранения list_t. Вы должны создать это пространство и назначить его list.

Вы должны делать следующее:

int main(void) { 

    list_t *list; 
    test(); 
    list = malloc(sizeof(list_t)); 
    //Always check for a null return from malloc! 
    if(!list){ 
    perror("Malloc failed"); 
    } 
    list->head=NULL; 
    test(); 
+1

Также помните 'free()' память, выделенную 'malloc', когда она больше не нужна. – harald

+0

Это имеет смысл, и на самом деле у меня есть malloc, но по какой-то причине удалил его. Так что о освобождении памяти, когда это нужно делать? Я имею в виду, что имеет смысл делать в конце, когда я закончил использовать список или когда хочу объявить новый список, удалив предыдущий. Правильно? – aldebaran

+0

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

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