我在一个类中编写了一个打印函数,出现了分段错误。
void print() {
int i;
for(i=0; i<counter; i++){
parents[i]->print();
}
}
parent是指向父对象的指针的数组。父对象的父对象打印为:
void print() const{
int i;
std::cout << "Desired teachers:" << tnumb << std::endl;
for(i=0; i<tnumb; i++){
std::cout << "Teachers number:" << teachers[i] << "\t";
}
std::cout << std::endl;
}
而且我已经确认,如果我在自己的主要对象中结了新 parent ,然后调用它,它会起作用。有趣的是,如果我这样写printq:
void print() {
int i;
for(i=0; i<counter; i++){
std::cout << "ok\t";
}
}
不会出现任何分段错误,并且可以按预期进行很多操作(counter btw是一个int类型,用于计算parent数组中的项目数)。但是,如果我这样写:
void print() {
int i;
for(i=0; i<counter; i++){
std::cout << "ok\t";
parents[i]->print();
}
}
没有打印出一个确定,并且出现分段错误。我不明白为什么连第一个指令都没有执行。
抱歉,我的代码太通用了。我试图保留必需品,因为它仍然很凌乱并且很容易丢失。
这是类的构造函数:
queue(int _size): start(0), end(0), current(0), size(_size), counter(0){
parents = new parent *[size];
}
并通过此推功能将一个父项插入到父项中:
void push(parent *p){
if(p->get_done()){
return;
}
p->set_start();
if(p->enter_start()){
std::cout << "*Entire line boos*\n";
}
if(!full()){
end++;
counter++;
parents[end] = p;
}else{
std::cout << "Parents queue is full\n";
}
}
set_start和line booing起作用,并且对父级没有实际影响(这只是一个带有简单标志的senario,它将触发或不触发cout)。计数器提供到这一点为止插入的项目数,而end是一个整数,它给出队列中最后使用的位置。
消息 parent 队列已满没有出现,因此, parent [end]必须包含 parent p。
如果需要更多信息,请发表评论,我将对其进行编辑
最佳答案
您可能正在尝试在空指针上调用print()。
parents[i]->print();
上面的代码中
parents[i]
可能为null。您可以在访问
parents[i]
之前做一个简单的测试,如下所示:if (parents[i] != NULL) {
parents[i]->print();
} else {
std::cout << " parents[" << i << "] was null!" << std::endl;
}
就像TrebuchetMS在上面的评论中提到的那样,您可以冲洗cout以确保即使出现分段错误也可以打印所有内容。因此,我建议将其作为最终代码来帮助您进行调试:
void print() {
int i;
for(i=0; i<counter; i++){
std::cout << "ok\t";
cout.flush();
if (parents[i] != NULL) {
parents[i]->print();
} else {
std::cout << "parents[" << i << "] was null!" << std::endl;
cout.flush();
}
}
}
这不会帮助您找出
parents[i]
为什么为null的事实,但会证明它是null。下一步是找出为什么它为null,为此,我们需要查看更多代码。调试愉快!
关于c++ - 循环输入期间for循环中的C++段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53694093/