2013-10-17 91 views
1

我在我的main創建了兩個節點,我試圖遍歷列表檢查每個節點內的變量,稱爲令牌。我省略了一堆我的代碼是不相關的,如段錯誤遍歷鏈表

輸出:

name 
    about to enter checknode 
    in checknode 
    in do loop of check node 
    in do loop of check node 
    in do loop of check node 
    Segmentation fault (core dumped) 
+0

你從哪裏調用'checkNode()'? –

+0

你可以嘗試一個調試,比如'gdb'嗎? –

+0

什麼是'nodeT'? –

回答

3
I have omitted a bunch of my code that is irrelevant such as the createnode() 

我要說的是createnode()可能是最相關的。如果你沒有正確地初始化你的節點,意思是明確地將成員指針設置爲NULL,那麼next這樣的節點的指針將會有一些垃圾值。這將解釋你爲什麼第三次進入循環,爲什麼它崩潰。

編輯:

typedef struct node_ nodeT; 
// ... 
nodeT *node=(nodeT*)malloc(sizeof(nodeT*)); 
return node 

您想爲nodeT分配內存,所以你應該傳遞類型的大小,指針,該類型的不是大小。它應該是sizeof(nodeT)而不是sizeof(nodeT*)。正如我所說,該結構的成員沒有初始化,所以next將有一些垃圾值,不同於NULL,並且您的循環檢查將失敗。

headPtr->token=malloc(sizeof(char)*100); 
headPtr->token="A"; 

這也是錯誤的。首先分配一些內存,然後在token中保存指向它的指針,然後在token中保存指向字符串「A」的指針。你鬆散的指針指向你分配的內存,所以你有內存泄漏。您應該使用strcpy()(或strdup(),然後即使不需要malloc())。

+0

我添加了我的createnode(),並且我編輯了main以顯示malloc()。在任何遍歷完成之前,malloc和每個節點的結構中的變量初始化都已完成。 – user2644819

0

只是看這條線headPtr=createNode();我可以告訴大家,createNode()功能失常 因爲你只需創建一個節點,但沒有分配足夠多的空間,它持有的字符串,多數民衆贊成在該段錯誤的來源。這裏是你的檢查功能的另一個版本,你似乎有點凌亂:

nodeT* checkNode (nodeT* node , char* token) 
{ 
     if(node) 
     { 
       if(!strcmp(token , node->token)) 
       { 
         printf("token match\n"); 
         return node; 
       } 
       checkNode(node->next , token); 
     } 
} 

編輯creatNode功能的確是非常錯誤的,因爲我今天心情好我,這裏的修正版本;):

nodeT* createNode(nodeT* node , char* token , char* fileName , char* instance) 
{ 
     if(node) 
      node = creatNode(node->next); 
     else 
     { 
      node = malloc(sizeof(nodeT)); 
      node->token = strdup(token); 
      node->fileName = strdup(fileName); 
      node->instance = strdup(instance); 
      node->next = NULL; 
     } 
     return node; 
} 
+0

我剛剛添加了我的createnode(),並且在我的結構中爲指針添加了100字節的malloc(),但它仍然不會給我任何結果。 – user2644819

+0

我加了tmpPtr1-> next = NULL;在我的主要和程序工作。你的建議有幫助,但我沒看到我的代碼中有太多錯誤,儘管你在createnode()中初始化了所有內容,而我在main中做了這些。 – user2644819

+0

你應該知道「工作」並不一定意味着「正確」,即使它錯了,你的代碼(特別是'createNode'函數)是錯誤的,但某種程度上它可以工作 –