for循环导致随机segfault C ++

时间:2013-12-11 06:03:35

标签: c++ loops segmentation-fault

我的程序运行正常,直到我尝试添加一个简单的for循环,然后我得到一个seg错误。我会继续发布主要内容,以便您可以看到:

     using namespace std;

int main(int argc, char* argv[]){                                                              
struct question questions[argc-1];                                                             //Array of questions to be filled by loop.
int sizeOfQuestions = argc-1;                                                                    //number of questions passed in at run time
int numLines = 0;                                                                            //number of lines in file
for(int i=1;i<argc;i++){                                                                         //Test loop to make sure the command line file names are read in
    std::cout << argv[i] << " says hello" << std::endl;
}

for(int count=0;count<sizeOfQuestions;count++){                                              //This loop places the information from the files into structs
    char* fileName;
    std::string word = argv[count+1];
    word+=".txt";
    strcpy(fileName, word.c_str());
    std::fstream questionFile (fileName, std::fstream::in);                                 //Open the file
    if(questionFile.good()){
        cout << "In File:  \t" << fileName << endl;
        setQuestionFileName(&(questions[count]),word);                                          
        getline(questionFile,questions[count].programNum);
        getline(questionFile,questions[count].programDesc);
        getline(questionFile,questions[count].programPoints);
        getline(questionFile,questions[count].programInput);
        questionFile.close();
    }else{
        cout << "Could not open file!!!" << endl;
    }

}

sort(questions,questions+sizeOfQuestions);

display(questions[0]);
cout << "" << endl;
cout << "" << endl;
display(questions[1]);


return 0;

} 

将准确显示它应该显示的内容。但是当我从

更改代码的最后一部分时
    display(questions[0]);
    cout << "" << endl;
    cout << "" << endl;
    display(questions[1]); 

要:

     for(int k=0;k<2;k++){
     display(questions[k]);
     cout << "" << endl;
     cout << "" << endl;
     }

我在第一个for循环之后就出现了一个分段错误,其中是"says hello",为什么会这样?即使我删除了display()并在循环中只做了几个cout语句,它仍然会中断。

1 个答案:

答案 0 :(得分:2)

你有这些行

char* fileName;
...
strcpy(fileName, word.c_str());

但是你无处为fileName 分配内存。

因为未初始化的局部变量(如fileName)具有不确定的值,所以在没有初始化的情况下使用它们(比如为指针分配内存)会导致未定义的行为

在这种情况下,您实际上不需要 fileName指针。在C ++ 11中,文件流构造函数已更改为接受std::string(请参阅例如this reference),如果您有较旧的库,则在打开文件时只需使用word.c_str()。 / p>

所以请跳过fileName变量,然后执行

std::ifstream questionFile (word);

或可能

std::ifstream questionFile (word.c_str());