【问题标题】:segmentation fault traversing linkedlist [closed]分段错误遍历链表
【发布时间】:2013-10-17 20:29:01
【问题描述】:

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

【问题讨论】:

  • 你在哪里打电话给checkNode()
  • 你能试试调试吗,比如gdb
  • typedef struct node_nodeT;
  • 这就是你的完整creatNode 功能吗?
  • 是的,我错过了什么吗?两个节点的实际初始化和链接都在main中。

标签: c linked-list segmentation-fault


【解决方案1】:
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())。

【讨论】:

  • 我添加了我的 createnode() 并编辑了 main 以显示 malloc()。结构体中每个节点的变量的 malloc 和初始化是在任何遍历完成之前完成的。
【解决方案2】:

仅通过查看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;
}

【讨论】:

  • 我刚刚添加了我的 createnode() 并在 main 中添加了 malloc() 100 字节作为我的结构中的指针作为示例,它仍然没有给我任何结果。
  • 我添加了 tmpPtr1->next=NULL;在我的主要和程序工作。您的建议有所帮助,但我在我的代码中没有看到太多错误,尽管您在 createnode() 中初始化了所有内容,而我在 main 中进行了操作。
  • 你应该知道“工作”并不一定意味着“正确”,即使它是错误的并且你的代码(尤其是 createNode 函数)是错误的但它以某种方式工作也可以工作跨度>
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多