【问题标题】:Getting Segmentation Fault in C++, but why?在 C++ 中出现分段错误,但为什么呢?
【发布时间】:2011-01-28 05:36:26
【问题描述】:

我在这段代码中遇到了分段错误,但我不知道为什么。我知道当指针为 NULL 或指向随机内存地址时会发生分段错误。

 q = p;
        while(q -> link != NULL){
            q = q -> link;
        }
        t = new data;
        t -> city = cityName;
        t -> latitude = lat;
        t -> longitude = lon;
        q -> link = t;

这是控制台中实际出现的错误:

line 33: 2219 Segmentation fault    sh "${SHFILE}"

【问题讨论】:

  • @Carlos:为什么要删除所有代码?据我从您接受的答案中了解到,其中一些相关的。

标签: c++ pointers segmentation-fault


【解决方案1】:

Database::addelse子句中,你没有设置t->link = NULL,所以它是未初始化的。

您应该为data 添加一个构造函数来初始化其成员,或者使用值初始化new 来确保所有内容都正确初始化:

t = new data(); // note the parentheses

【讨论】:

    【解决方案2】:

    这可能是因为当您将新节点添加到列表末尾时:

    else{
        q = p;
        while(q -> link != NULL){
            q = q -> link;
        }
        t = new data;
        t -> city = cityName;
        t -> latitude = lat;
        t -> longitude = lon;
        q -> link = t;
    }
    

    你没有设置t->link = NULL;

    【讨论】:

      【解决方案3】:

      您没有将 Database::data::link 设置为 NULL in Database::add:

          t = new data;
          t -> city = cityName;
          t -> latitude = lat;
          t -> longitude = lon;
          t -> link = NULL;
      

      编辑: 我会为Database::data 添加一个构造函数来初始化各种成员。比如:

      class Database {
          struct data {
              data(): latitude(0.0), longitude(0.0), link(NULL) {}
              ...
          };
          ...
       };
      

      那么您不必担心未初始化的内存。

      【讨论】:

        【解决方案4】:

        编译时使用 -g 作为 g++ 的参数

        然后从命令行“gdb(二进制名称)”

        在gdb内部,“运行”,它会一直执行到出错

        键入“bt”以查看堆栈跟踪

        【讨论】:

        • 很抱歉没有给你提供你需要的东西。我会记住以后不要回答你的问题
        • 什么告诉你他是反对你的人? (不,不是我。;))
        • 我投了反对票,因为 A. 用户似乎是初学者,可能不知道“堆栈跟踪”。 B. 用户没有从命令行运行,并且可能没有使用 gdb 的经验。 C. 没有说用户安装了 GDB。 D. 你没有花时间看代码和回答问题,你只是简单地输入了一个罐头的响应,等等。
        • 也许这就是你的想法,但我正在查看这个问题,它说“这段代码有什么问题”。您的回答没有回答该问题,并且您假设用户知道他发布的内容太多。例如,用户正在使用 netbeans。你甚至不知道他知道什么是g++,更不用说gdb。因此我投了反对票。
        • +1:调试器在处理与内存相关的问题时特别有用 -> 很好的答案。
        【解决方案5】:

        可能还有其他问题,但这里有一个:

        else{
            q = p;
            while(q -> link != NULL){
                q = q -> link;
            }
            t = new data;
            t -> city = cityName;
            t -> latitude = lat;
            t -> longitude = lon;
            q -> link = t;
        }
        

        您从未将 t->link 设置为 null,因此它充满了垃圾。

        【讨论】:

          【解决方案6】:

          你需要将t的链接赋值为NULL:

          else{
              q = p;
              while(q -> link != NULL){
                  q = q -> link;
              }
              t = new data;
              t -> city = cityName;
              t -> latitude = lat;
              t -> longitude = lon;
              t -> link = NULL; // add this
              q -> link = t;
          }
          

          【讨论】:

          • 呵呵,大家同时回答。
          猜你喜欢
          • 2014-11-29
          • 1970-01-01
          • 1970-01-01
          • 2018-01-13
          • 2018-04-10
          • 2011-04-23
          相关资源
          最近更新 更多