我在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
中保存指向它的指针,然后在token
中保存指向文本字符串"A"的指针。您松散了指向您分配的内存的指针,因此您有内存泄漏。您应该改用strcpy()
(或strdup()
,然后甚至不需要malloc()
)。
仅通过查看这一行headPtr=createNode();
我就可以判断createNode()
函数是错误的因为你只是创建了一个节点,但没有为它分配足够的空间来容纳字符串,这就是段错误的来源,这是你的检查函数的另一个版本,你的似乎有点乱:
nodeT* checkNode (nodeT* node , char* token)
{
if(node)
{
if(!strcmp(token , node->token))
{
printf("token matchn");
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;
}