2013-11-20 187 views
0

好日子大家,調用函數結構

我開始用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提前

編輯:我其實解決的問題:問題是,指針didnt點實際的對象,所以 當我加入

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和可能造成的。 egmentation錯誤。

因爲你很可能新的C,我會解釋一下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

還要記住在不再需要時釋放(')由'malloc'分配的內存。 – harald

+0

這是有道理的,我實際上有malloc但由於某種原因刪除它。 那麼關於釋放內存,什麼時候需要去做呢?我的意思是說,當我完成使用列表或者當我想聲明新列表刪除previous時,最終做到這一點是對的。 – aldebaran

+0

當您完成整個列表時,您必須通過它並將其釋放。如果你刪除了一個節點,你也必須釋放該節點。 –