它可以与Visual Studio一起使用,但是在Cygwin中存在段错误,这很奇怪,因为我正在编译相同的源代码,并且都生成Windows可执行文件。由于某些原因,GDB在Cygwin中对我来说效果不佳,并且该错误未在VS中出现,因此我无法在那里进行真正的调试。
有任何想法吗?
int main(void)
{
Pair ***occurences = new Pair**[20];
int i, j, k;
for (i = 0; i < 20; i++)
{
occurences[i] = new Pair*[i+1];
for (j = 0; j < i+1; j++)
{
occurences[i][j] = new Pair[26];
for (k = 0; k < 26; k++)
{
Pair pair;
pair.c = k + 'a';
pair.occurs = 0;
occurences[i][j][k] = pair;
}
}
}
std::fstream sin;
sin.open("dictionary.txt");
std::string word;
while (std::getline(sin, word))
{
if (word.size() < 21)
{
for (i = 0; i < word.size(); i++)
{
// SEGFAULTING HERE
occurences[word.size()-1][i][word[i] - 'a'].occurences++;
}
}
}
for (i = 0; i < 20; i++)
{
for (j = 0; j < i+1; j++)
{
delete [] occurences[i][j];
}
delete [] occurences[i];
}
delete [] occurences;
return 0;
}
最佳答案
您将此行标记为关键点:
occurences[word.size()-1][i][word[i] - 97].occurs++;
这三个数组的所有访问都可能在这里出错,因此您必须检查所有它们:
似乎数组的第一个维度的长度为20,因此索引的有效值为[0..19]。如果单词本身的大小为零,则
word.size()-1
小于0;如果单词大小为21或更大,则ojit_code大于19。您确定单词的长度始终在[1..20]范围内吗?
第二维的长度取决于第一维的索引。您确定这永远不会超出范围吗?
第三维度使我印象最深刻。从字符代码中减去97,然后将结果用作包含26个条目的数组的索引。假定所有字符都在[97..122]范围内,表示['a'..'z']。您确定输入中永远不会有其他字符吗?例如,如果有任何大写字母,则结果索引将为负。
关于c++ - Cygwin中的Segfault,而不是VS,有什么想法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6368127/