首页 文章

在循环中进入期间的for循环中的C分段错误

提问于
浏览
0

我在类中编写了一个print函数,出现了分段错误 .

void print() {
        int i;
        for(i=0; i<counter; i++){
            parents[i]->print();
        }
    }

parents是指向父对象的指针数组 . 父父对象打印是:

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;
}

并且我已经确认如果我在我的主人中创建一个新的父母然后打电话给它 . 什么是intrensting是如果我写printq如下:

void print() {
        int i;
        for(i=0; i<counter; i++){
            std::cout << "ok\t";
        }
    }

不会出现任何分段错误,并且会有尽可能多的ok(计数器btw是一个int类型,它计算parent数组中的项目数) . 但如果我这样写:

void print() {
        int i;
        for(i=0; i<counter; i++){
            std::cout << "ok\t";
            parents[i]->print();
        }
    }

打印不正常,出现分段错误 . 我无法理解为什么即使是第一个cout也没有被执行 .

对不起,如果我的代码太通用了 . 我试图保留必需品,因为它仍然很脏,很容易迷路 .

这是类的构造函数:

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或不触发cout) . Counter提供到此时插入的项目数,而end是一个int,它给出了队列中最后一个使用的点 .

消息 parents queue is full 未出现,因此父[end]必须包含父p .

如果需要更多信息,请发表评论,我将对其进行编辑

2 回答

  • 3

    您可能正在尝试在空指针上调用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但会证明它是 . 下一步是找出它为空的原因,为此我们需要查看更多代码 .

    快乐的调试!

  • 1

    我发现错误归功于a7ger在调试方面的帮助 . 显然我试图访问一个NULL指针成员 . 我正在做 end++ 然后 parents[end] = p ,而我应该做相反的事情 . 谢谢您的帮助

相关问题