我有一个这样的循环:
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++功能中的任何一项,并且没有任何测试覆盖率,您将使事情变得更加困难。例如,如果您有一个"字符串复制"函数来复制字符串,并且对该函数进行了测试覆盖,则您可能自己已经本地化了此问题。