【问题标题】:Troubleshooting segmentation fault (core dumped) in linked lists解决链表中的分段错误(核心转储)
【发布时间】:2015-04-19 23:27:44
【问题描述】:
Node *orderedInsert(Node *p, int newval)
/* Allocates a new Node with data value newval
   and inserts into the ordered list with 
   first node pointer p in such a way that the
   data values in the modified list are in 
   nondecreasing order as the list is traversed.
*/
{
   Node* current = NULL;
   Node* prev = NULL;
   Node* newNode = (Node*)malloc(sizeof(Node));
   newNode->next = NULL;
   newNode->data = newval;

   if(newNode == NULL)
      printf("Could not allocate memory for new node");

   current = p;   

   if(p == NULL){

      current = newNode;
      newNode->next = NULL;
      newNode->data = newval;
      return  newNode;
   }
   else if(newval < p->data){
      newNode->next = p;
      p = newNode;
      return p;
   }
   else{
      prev = p;
      current = current->next;   

      while(newNode->data > current->data && current != NULL){

         prev = current;
         current = current->next;
      }
      if(current == NULL){
         prev->next = newNode;
         newNode->next = NULL;
      }
      else{
         newNode->next = current;
         prev->next = newNode;
      }
   }

}

void printList(FILE *outfile, Node *p)
/* Prints the data values in the list with 
   first node pointer p from first to last,
   with a space between successive values.
   Prints a newline at the end of the list.
*/
{

   Node* current = p;

   while(current != NULL){
      fprintf(outfile, "%d ",current->data);
      current = current->next;
   }
   fprintf(outfile, "\n");

}

int main(int argc, char * argv[])
{
   assert(argc == 3);
   Node * p = NULL;
   int newval, retval;
   int op;

   FILE *in = fopen(argv[1],"r");
   assert(in != NULL);
   FILE *out = fopen(argv[2],"w");
   assert(out != NULL);
   do {
      op = fgetc(in);
   }  while (op != EOF && isspace(op));

   while(op != EOF && op != 'q') {
      switch(op) {
     case 'i':
        fscanf(in,"%d",&newval);
        p = orderedInsert(p,newval);
        printList(out,p);
        printList(stdout,p);
        break;
     case 'c':
        clearList(&p);
        break;
     default:
        fclose(in);
        fclose(out);
        return 0;
      }
      do
     op = fgetc(in);
      while (op != EOF && isspace(op));
   }

   fclose(in);
   fclose(out);
   return 0;
}

我在调试代码时遇到了这个错误。我的代码中是否缺少明显的内容和/或您有任何调试此错误的提示?除了它甚至没有超过第一个列表条目(当列表为空时)之外,我只是发现自己迷失了从哪里开始。

谢谢

编辑:我已经提交了修改后的代码,现在只在输入大于列表中第一个数字时出现分段错误。

【问题讨论】:

  • 第 15 行是if(newNode = NULL),应该是:if(newNode == NULL)(比较)
  • 噢!不再..感谢您的帮助。我应该删除这个问题吗?我不知道该网站的正确礼仪。
  • 它有 1 个赞,所以你可以保留它,我会添加答案,你可以接受,因为它很有用。干杯!
  • 能否更新代码 sn-p 以包含 main 方法?
  • 我也想看看printListclearList 方法

标签: function debugging pointers linked-list segmentation-fault


【解决方案1】:

添加一些关于调试 C/C++ 程序的一般说明。

GDB 是一个很好的工具,您必须将它附加到您的可执行文件中,然后运行该程序。没有 gui 模式,但人们已经围绕它构建了 gui 包装器,例如DDD

如果可以的话,我发现使用 IDE 会更容易,具体取决于您使用 MS Visual Studio 的环境,Netbeans CPPEclipse CDTQtCreator 和 Jetbrains 的最新 C++ IDE CLion 应该是一些工具可以帮助您更好地编码。

测试一下,我不会遇到分段错误。我正在使用 g++ 版本(Ubuntu 4.8.2-19ubuntu1) 4.8.2 在 ubuntu 14.04 上进行测试。可能存在逻辑错误,因为我不太清楚从 file1 读取然后插入到 file2 背后的逻辑

编译:g++ Node.cpp

运行:./a.out /home/vsnyc/tmp/1.txt /home/vsnyc/tmp/2.txt

File: 1.txt
i 12 i 4 i 6 i 9 q

Node.cpp 如下:

//Filename: Node.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

struct Node {
    Node *next;
    int data;
};

Node *orderedInsert(Node *p, int newval)
/* Allocates a new Node with data value newval
   and inserts into the ordered list with 
   first node pointer p in such a way that the
   data values in the modified list are in 
   nondecreasing order as the list is traversed.
*/
{
   Node* current = NULL;
   Node* prev = NULL;
   Node* newNode = (Node*)malloc(sizeof(Node));
   newNode->next = NULL;
   newNode->data = newval;

   if(newNode == NULL)
      printf("Could not allocate memory for new node");

   current = p;   

   if(current == NULL){

      current = newNode;
      newNode->next = NULL;
      newNode->data = newval;
      return current;
   }
   else if(newval < current->data){
      newNode->next = current;
      current = newNode;
      return current;
   }
   else{
      prev = p;
      current = current->next;   

      while(newNode->data > current->data && current != NULL){

         prev = current;
         current = current->next;
      }
      if(current == NULL){
         prev->next = newNode;
         newNode->next = NULL;
      }
      else{
         newNode->next = current;
         prev->next = newNode;
      }
   }
}

void clearList(Node ** p) {
}


void printList(FILE *outfile, Node *p)
/* Prints the data values in the list with 
   first node pointer p from first to last,
   with a space between successive values.
   Prints a newline at the end of the list.
*/
{

   Node* current = p;

   while(current != NULL){
      fprintf(outfile, "%d ",current->data);
      current = current->next;
   }

}


int main(int argc, char * argv[])
{
   assert(argc == 3);
   Node * p = NULL;
   int newval, retval;
   int op;

   FILE *in = fopen(argv[1],"r");
   assert(in != NULL);
   FILE *out = fopen(argv[2],"w");
   assert(out != NULL);
   do {
      op = fgetc(in);
   }  while (op != EOF && isspace(op));

   std::cout << op << "\n";

   while(op != EOF && op != 'q') {
      switch(op) {
     case 'i':
        fscanf(in,"%d",&newval);
        std::cout << newval << "\n";
        p = orderedInsert(p,newval);
        printList(out,p);
        printList(stdout,p);
        break;
     case 'c':
        clearList(&p);
        break;
     default:
        fclose(in);
        fclose(out);
        return 0;
      }
      do
     op = fgetc(in);
      while (op != EOF && isspace(op));
   }

   fclose(in);
   fclose(out);
   return 0;
}

【讨论】:

  • 修复后仍然出现分段错误。我想还有别的东西。它只适用于列表的第一个条目。
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多