分段故障遍历链表

时间:2013-10-17 20:29:01

标签: c linked-list segmentation-fault

我在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)

2 个答案:

答案 0 :(得分: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())。

答案 1 :(得分:0)

只需查看此行headPtr=createNode();我就可以看出createNode()函数是错误的 因为你只是创建一个节点但是没有为它保存字符串的enought空间,以及那些来自segfault的地方。这里是你的检查函数的另一个版本,你的看起来有点乱:

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;
}