在C ++中获取分段错误,但为什么呢?

时间:2010-03-16 17:19:57

标签: c++ pointers segmentation-fault

我在此代码中遇到分段错误,但我无法弄清楚原因。我知道当指针为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}"

6 个答案:

答案 0 :(得分:6)

else的{​​{1}}子句中,您未设置Database::add,因此未初始化。

您应该为t->link = NULL添加一个初始化其成员的构造函数,或者使用值初始化data来确保所有内容都已正确初始化:

new

答案 1 :(得分:3)

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

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;

答案 2 :(得分:3)

您未将{:: 1}}中的{:: 1}}数据库:: data :: link设置为:

NULL

修改的: 我会为Database::add添加一个构造函数来初始化各个成员。类似的东西:

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

然后你没有未初始化的内存来担心。

答案 3 :(得分:1)

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

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

在gdb内部,“运行”,它将执行直到故障

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

答案 4 :(得分:1)

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

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,因此它充满了垃圾。

答案 5 :(得分:1)

您需要将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;
}