2017-05-10 9 views
2

リンクリストを実装しようとしていますが、文字列の配列を追加するときに問題があります。初めて問題を追加しますが、私の挿入機能を再度呼び出すと、 "Segmentation fault:11"というエラーが発生します。ここでLinkedListに文字列のリストを追加

はコードです:

typedef struct node_s{ 
    int id; 
    char *cmd; 
    char **args; 
    int numArgs; 
    int connected; 
    struct node_s *next; 
}node; 

typedef node *NODES; 

void insert(NODES *nodes, int idNode, char *cmdNode,char **argsNode, int nArgs,int conn){ 
    int i; 

    if (!exist(*nodes,idNode)) 
    { 
     if(*nodes==NULL){ 
      *nodes = (NODES) malloc(sizeof(struct node_s)); 
      if(*nodes==NULL) 
      { 
       perror("malloc err"); 
       return; 
      } 

      (*nodes)->id = idNode; 
      (*nodes)->cmd = strdup(cmdNode); 
      // Problem 
      for(i=0;i<nArgs;i++) 
       (*nodes)->args[i]=strdup(argsNode[i]); 
      (*nodes)->numArgs=nArgs; 
      (*nodes)->connected=conn; 
      (*nodes)->next = NULL; 
     } 
     else 
      insert(&(*nodes)->next,idNode,cmdNode,argsNode,nArgs,conn); 

    } 
} 

int main() 
{ 
    char *cmds[4]={"wc", "-l", "another","hello.com"}; 
    NODES nodes;  
    inicNodes(&nodes); 
    insert(&nodes,1,"wc",cmds,4,0); 
// if i try to list my values here it shows them as expected.  
    insert(&nodes,3,"ls",cmds,4,1); 

    return 0; 
} 

ありがとうございました。

+1

'(* nodes) - > args [i] = strdup(argsNode [i]); ' - 未定義の動作を呼び出します。あなたは 'args'のためのポインタベッドを割り当てるのを忘れました。 '(* nodes) - > args = malloc(nArgs * sizeof(char *));'がありません。 – WhozCraig

+0

@kuroは答えに感謝しますが、うまくいきませんでした。それでも同じエラー。 – ohiohai

+0

@WhozCraig私の答えは、あなたの前で答えたユーザーの黒でした。あなたの答えはそれを修正しました。 – ohiohai

答えて

3

いくつか問題があります。

あなたがリストの先頭に初期化する必要があります:あなたはクラッシュがどこにあるかを確認したい場合は、

(*nodes)->args = malloc(sizeof(char *)*nArgs) 

デバッガを使用します。

NODES nodes = NULL; 

あなたはargs配列を割り当てることができませんでした。クラッシュ後

# gdb ./prog 
(gdb) run 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004006e9 in insert (nodes=0x7fffffffdc98, idNode=1, 
    cmdNode=0x40088f "wc", argsNode=0x7fffffffdca0, nArgs=4, conn=0) at qq.c:33 
33     (*nodes)->args[i]=strdup(argsNode[i]); 

(gdb) backtrace 

あなたは、正確な障害のあるライン

もう一つが表示されます。リンクリストの挿入に再帰を使用するのは現実的ではありません。それはかなり速くスタックの限界に達するでしょう。

+0

再帰を使用することは悪い考えであることを認識していませんでした。そして、デバッガについての例のおかげで、それをよりよく見てみましょう! – ohiohai

関連する問題