我在一个类中编写了一个打印函数,出现了分段错误。

        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/

10-17 00:29