0

2 つのノードが作成されて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)
4

2 に答える 2

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

createnode()ここで最も関連性があると言えます。ノードを適切に初期化しない場合、つまり明示的にメンバー ポインターを NULL に設定するとnext、そのようなノードのポインターにはガベージ値が含まれます。これで、3 回目のループに入る理由とクラッシュする理由が説明されます。

編集:

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から、リテラル文字列 "A" へのポインタを に保存しますtoken。割り当てたメモリへのポインタが失われるため、メモリリークが発生します。代わりに使用する必要がありますstrcpy()(または必要strdup()ありmalloc()ません)。

于 2013-10-17T20:42:33.920 に答える
0

この行headPtr=createNode();を見るだけで、ノードを作成しただけで、文字列を保持するのに十分なスペースを割り当てていないため、createNode()関数が間違っていることがわかります。これがセグメンテーション違反の原因です。別のバージョンのチェックがありますfunction 、あなたのものは少し厄介なようです:

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

EDIT あなたの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;
}
于 2013-10-17T20:49:56.010 に答える