在某些运行中出现Seg错误,而在其他运行中没有(使用相同的输入文件)

Seg-fault on some runs and not on others (with the same input file)

本文关键字:运行 文件 输入 其他 Seg 错误      更新时间:2023-10-16

我是一名CS学生,正在上c++课程。我有一个奇怪的错误,程序有时会在同一个输入上运行seg错误(有时不会)。我对可能发生的事情感到非常困惑。有人有什么想法吗?我的帖子是按以下顺序排列的:我的代码、输入文件、输出(使用相同输入的3个不同输出)。

#include <iostream>
#include <fstream>
#include <string>
struct Class {
    std::string name;
    double totalWork;
    double totalLearned;
    bool hasVisited;
    Class* neighbors;
    Class* previousClass;
};
void searchClassOne(int indexCurrent, int indexNeighbor, int numClasses, double maxWork, 
                    double& maxLearning, Class* classes)
{
    if(indexCurrent == numClasses - 1)  return;
    if(indexNeighbor == numClasses - 2) {
        indexNeighbor = 0;
        indexCurrent++;
    }
    int totalWork = classes[indexCurrent].totalWork +         
        classes[indexCurrent].neighbors[indexNeighbor].totalWork;
    int totalLearning = classes[indexCurrent].totalLearned +     
        classes[indexCurrent].neighbors[indexNeighbor].totalLearned;
    if(totalLearning > maxLearning && totalWork < maxWork)  maxLearning = totalLearning;
    indexNeighbor++;
    searchClassOne(indexCurrent, indexNeighbor, numClasses, maxWork, maxLearning, classes);
    return;
}
int main(int argc, char* argv[])
{
    std::string fileName = argv[1];
    std::ifstream ifile(fileName);
    int numClasses = 0, maxWork = 0;
    ifile >> numClasses >> maxWork;
    std::string dummy;
    getline(ifile, dummy);
    Class* classes = new Class[numClasses];
    for(int index = 0; index < numClasses; index++) {
        classes[index].neighbors = new Class[numClasses - 1];
    }
    for(int index = 0; index < numClasses; index++) {
        classes[index].name = "";
        classes[index].totalWork = 0.0;
        classes[index].totalLearned = 0.0;
        classes[index].hasVisited = false;
    }
    int classNum = 0;
    std::cout << "CHECK 1" << std::endl;
    while(classNum < numClasses) {
        ifile >> classes[classNum].name;
        ifile >> classes[classNum].totalWork;
        ifile >> classes[classNum].totalLearned;
        std::string dummyTwo;
        getline(ifile, dummyTwo);
        classNum++;
    }
    std::cout << "CHECK 2" << std::endl;
    for(int i = 0; i < numClasses; i++) {
        std::cout << "CHECK 3 + " << i << std::endl;
        for(int j = 0; j < numClasses; j++) {
            std::cout << "CHECK 4 + " << j << std::endl;
            if(classes[i].name != classes[j].name)
                classes[i].neighbors[j] = classes[j];
        }
    }
    std::cout << "CHECK 5" << std::endl;
    double maxLearning = 0;
    searchClassOne(0, 0, numClasses, maxWork, maxLearning, classes);
    std::cout << "Maximum learning: " << maxLearning << std::endl;
    delete [] classes;
    classes = NULL;
    return 0;
}

输入文件读取:

4 3.14159
CSCI104 3.001 10.0
CSCI170 2.41       8.0
ENGR102  0.10 0.36
CSCI280    0.66 2.15

输出读取(多次):

Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 2
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 3
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 5
Maximum learning: 8
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
Segmentation fault: 11
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 2
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 3
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 5
Maximum learning: 8
Rafaels-MacBook-Pro-2:hw2 Rafael$ ./hw2q6 hw2q6.txt
CHECK 1
CHECK 2
CHECK 3 + 0
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
CHECK 3 + 1
CHECK 4 + 0
CHECK 4 + 1
CHECK 4 + 2
CHECK 4 + 3
Segmentation fault: 11

再看一下这一行:

classes[i].neighbors[j] = classes[j];

j的最大值是多少?neighbors的大小是多少?

编辑:这就是我所说的额外索引变量:

for(int i = 0; i < numClasses; i++) {
    std::cout << "CHECK 3 + " << i << std::endl;
    int neighborIndex = 0;
    for(int j = 0; j < numClasses; j++) {
        std::cout << "CHECK 4 + " << j << std::endl;
        if(classes[i].name != classes[j].name) {
            classes[i].neighbors[neighborIndex] = classes[j];
            neighborIndex++;
        }
    }
}