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

C++ Segmentation Fault in a While Loop

本文关键字:分段 错误 while 循环 C++      更新时间:2023-10-16

我有一个这样的循环:

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:该程序在窗口中运行流畅。

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

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

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

如果不使用使生活更简单的众多C++功能中的任何一项,并且没有任何测试覆盖率,您将使事情变得更加困难。例如,如果您有一个"字符串复制"函数来复制字符串,并且对该函数进行了测试覆盖,则您可能自己已经本地化了此问题。