我有一个这样的循环:
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中运行顺畅。
答案 0 :(得分:4)
word.word = new char [strlen(p_Word)];
strcpy(word.word,p_Word);
您没有为word.word
分配足够的空间。字符串长度为15个字符的字符串需要存储16个字符,因为C样式的字符串有一个nul终结符来标记它们的结尾。
覆盖已分配内存块边界的影响是不可预测的,并且可能在不同平台上有所不同。
通过不使用任何使生活更简单并且没有任何测试覆盖率的C ++功能,您将使事情变得更加困难。例如,如果你有一个“字符串重复”函数来复制字符串并具有该函数的测试覆盖率,那么你可能已经自己定位了这个问题。