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