While循环中的C ++分段错误

时间:2017-10-10 18:37:40

标签: c++ segmentation-fault runtime-error

我有一个这样的循环:

while (k < wordnum) {                                 // wordnum is 9 in my case

    /*There is a text file that includes some words
     *Starting positions of words are kept in wordIndexes
     *Don't worry about not having indexes*/

    //std::ifstream s_words
    s_words.seekg(*(wordIndexes + k) + 1, s_words.beg);
    char *p_Word = new char[16];
    s_words.getline(p_Word,15,'\n');

    //After getting word, they are copied in a struct
    word.id = wordnum - k;
    word.word = new char [strlen(p_Word)];
    strcpy(word.word,p_Word);
    word.wordLength = strlen(p_Word);
    delete[] p_Word;

    //At last, the word is sent for search
    if (verticalSearch(puzzleArray, &word)){
        k++;
        cout<<"Found vertically"<<endl;
        delete[] word.word;
        }
    else if (horizontalSearch(puzzleArray, &word)){
        k++;
        cout<<"Found horizontally"<<endl;
        delete[] word.word;
        }
    else if (diagonalSearch(puzzleArray, &word)){
        k++;
        cout<<"Found Diagon Alley"<<endl;
        delete[] word.word;
        }
    else{
        k++;
        delete[] word.word;
    }   
}

我知道这不是一个设计良好的代码,但事实并非如此。虽然循环和函数完美地工作,直到最后一个循环。当最后一个循环结束时,程序会给出分段错误,而不是退出循环。我确定最后一个字不是因为它以正确的方式找到并返回true。此外,我确信没有超过15个字符的单词。最后,k ++正在工作,k变为9.然后出现错误。我正在使用linux,所以我试图找到gdb的问题,我得到了这个:

  

编程接收信号SIGSEGV,分段故障。   0x00007ffff7534467在? ()来自/lib/x86_64-linux-gnu/libc.so.6

我不知道这意味着什么。这些信息可以帮助我,还是我应该尝试别的什么?

p.s:该程序在Windows中运行顺畅。

1 个答案:

答案 0 :(得分:4)

word.word = new char [strlen(p_Word)];
strcpy(word.word,p_Word);

您没有为word.word分配足够的空间。字符串长度为15个字符的字符串需要存储16个字符,因为C样式的字符串有一个nul终结符来标记它们的结尾。

覆盖已分配内存块边界的影响是不可预测的,并且可能在不同平台上有所不同。

通过不使用任何使生活更简单并且没有任何测试覆盖率的C ++功能,您将使事情变得更加困难。例如,如果你有一个“字符串重复”函数来复制字符串并具有该函数的测试覆盖率,那么你可能已经自己定位了这个问题。