C++ 塞格温的错误,但不是VS,有什么想法吗?

C++ 塞格温的错误,但不是VS,有什么想法吗?,c++,C++,它可以与VisualStudio一起工作,但在Cygwin中有segfaults,这很奇怪,因为我编译的是同一个源代码,并且两者都生成了一个Windows可执行文件。由于某种原因,GDB在Cygwin中对我来说不是很好,并且错误没有出现在VS中,所以我无法在那里调试它 有什么想法吗 int main(void) { Pair ***occurences = new Pair**[20]; int i, j, k; for (i = 0; i < 20; i++)

它可以与VisualStudio一起工作,但在Cygwin中有segfaults,这很奇怪,因为我编译的是同一个源代码,并且两者都生成了一个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;
}
int main(无效)
{
对***发生次数=新对**[20];
int i,j,k;
对于(i=0;i<20;i++)
{
发生率[i]=新对*[i+1];
对于(j=0;j
将我的评论重新表述为一个答案:

occurrences[word.size()-1][i][word[i]-'a'].occurrences++


如果
word.size()
为100(例如),这将崩溃(对于
i==0
),因为
occurrences
只有20个元素。

将我的注释重新格式化为答案:

occurrences[word.size()-1][i][word[i]-'a'].occurrences++


如果
word.size()
为100(例如),这将崩溃(对于
i==0
),因为
occurrences
只有20个元素。

您将此行标记为临界点:

occurences[word.size()-1][i][word[i] - 97].occurs++;
这三种阵列访问都可能出错,您必须全部检查:

似乎数组的第一个维度的长度为20,因此索引的有效值为[0..19]<如果单词本身的大小为零,则code>word.size()-1
将小于0;如果单词大小为21或更大,则它将大于19

您确定单词的长度始终在[1..20]范围内吗

第二个维度的长度可变,具体取决于第一个维度的索引。你确定这永远不会越界吗


我觉得第三维度是最明显的。从字符代码中减去97,然后将结果作为索引放入一个包含26个条目的数组中。这假设所有字符都在[97..122]范围内,表示['a'..'z']。您确定输入中永远不会有其他字符吗?例如,如果有任何大写字符,则结果索引将为负数。

您将此行标记为临界点:

occurences[word.size()-1][i][word[i] - 97].occurs++;
这三种阵列访问都可能出错,您必须全部检查:

似乎数组的第一个维度的长度为20,因此索引的有效值为[0..19]<如果单词本身的大小为零,则code>word.size()-1
将小于0;如果单词大小为21或更大,则它将大于19

您确定单词的长度始终在[1..20]范围内吗

第二个维度的长度可变,具体取决于第一个维度的索引。你确定这永远不会越界吗



我觉得第三维度是最明显的。从字符代码中减去97,然后将结果作为索引放入一个包含26个条目的数组中。这假设所有字符都在[97..122]范围内,表示['a'..'z']。您确定输入中永远不会有其他字符吗?例如,如果有任何大写字符,则结果索引将为负数。

您确定没有一行超过20个字符吗?顺便说一句,不要使用幻数,使用
word[i]-“0”
word[i]-“A”
或其他任何东西。@Let\u Me\u Be:“&&i您是否尝试过在VS中以调试模式编译,并启用所有运行时检查?@Arasumsen这有什么关系?您正在访问
实例[word.size()-1]
你确定你的字典里只有英文字母的小写字母吗?没有空格、数字之类的东西吗?试试:grep[^a-z]dictionary.txt你确定没有一行超过20个字符吗?顺便说一句,不要使用幻数,用
word[i]-'0'
word[i]-'a'
或其他任何东西。@Let'u Me'&&我有没有试过在VS中以调试模式编译,并启用所有运行时检查?@arasmussen这有什么关系?您正在访问[word.size()-1]您确定词典中只有英文字母的小写字母吗?没有空格、数字之类的吗?请尝试:grep[^a-z]dictionary.txt+1作为第二个维度。我本来打算写完全一样的东西。@Timbo:所有字符都是小写字母。@arasmussen发生故障时word的值是多少?我不确定,就像我说的,使用GDB和Cygwin进行调试是很困难的,并且错误无法在VS中重现。在该行之前将word的值写入控制台如何?在一个没有调试程序的世界里,仍然有printf+第二维度为1。我本来打算写完全一样的东西。@Timbo:所有字符都是小写字母。@arasmussen发生故障时word的值是多少?我不确定,就像我说的,使用GDB和Cygwin进行调试是很困难的,并且错误无法在VS中重现。在该行之前将word的值写入控制台如何?在一个没有调试程序的世界里,仍然有printf!很好,看一看修改后的代码,它仍然在崩溃。@Arasumssen现在你在第二维度上有问题了。您正在访问索引0..19,但是