0

我在其中创建了两个节点,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这个节点的指针就会有一些垃圾值。这可以解释为什么您第三次进入循环以及为什么它会崩溃。

编辑:

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()函数是错误的,因为您只是创建了一个节点,但没有为其分配足够的空间来保存字符串,这就是段错误的来源。这是您检查的另一个版本功能,你的似乎有点乱:

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;
}
于 2013-10-17T20:49:56.010 回答