我在其中创建了两个节点,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)
我在其中创建了两个节点,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)
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()
不需要)。
只需查看这一行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;
}