C ++分段 - 故障问题

时间:2009-09-03 21:21:31

标签: c++ segmentation-fault

我的程序崩溃了,这对我来说很好,当然我的程序说不然,这让我很困惑。

我正在处理的这部分功能片段:

        for(int k = 0; k < dictionary[k].size(); k++)
        {
            //"i" represents the fragment's first character
            //while "k" represents the dictionary first character
            if(fragments[i][j] == dictionary[k][j]) {
                token++;
                cout << token << endl;
            }
        }

可能是问题所在。当我调试问题时,调试器转到代码片段的第一行:

    for(int k = 0; k < dictionary[k].size(); k++)
当我尝试下一个时,

然后崩溃。 在调试器中,此窗口在我的代码块中打开:

Signal Received

Program Received Singal SIGEGV, segmentation fault. Do you want to view backtrace?

我点击了,这对我来说似乎是武断的。

有谁知道我做错了什么?

如果需要回溯(窗口显示Call Stack),我会在以后编辑它(如果需要)

编辑:这是整个功能,我认为没有必要

void Language::compare()
{
    int para = getParameters(0); //eg. 3

    int valid = para;
    int token = 0;

    for(int i = 0; i < para; i++)
    {
        //If the string is creater than 2 characters
        if(fragments[i].length() > 1) {
            for(int j = 0; j < fragments[i].length(); j++)
            {
                //Checking if that character match in dictionary
                for(int k = 0; k < para; k++) //Changed and now works,
                {
                    //"i" represents the fragment's first character
                    //while "k" represents the dictionary first character
                    if(fragments[i][j] == dictionary[k][j]) { //But now this line crashes
                        token++;
                        cout << token << endl;
                    }
                }
                if(token == 0) {
                    break;
                }
            }
        }
        else {
        //...
        }
    }
}

字典和片段在“语言”类中声明,它们都是向量。

5 个答案:

答案 0 :(得分:10)

我怀疑你打算在那里使用dictionary[k].size()作为循环控制的一部分,因为循环遍历k。您的意思是dictionary.size()还是dictionary[i].size()

答案 1 :(得分:7)

这一行:

for(int k = 0; k < dictionary[k].size(); k++)

看起来确实令人怀疑。你确定你不想循环到字典数组/集合的大小吗?

如果您发布了dictionary的定义,则可能有助于我们提供一些具体的建议。

答案 2 :(得分:1)

  

fragments[i][j] == dictionary[k][j]

在尝试取消引用dictionary[k].size()>j之前,您应该确保dictionary[k][j]

答案 3 :(得分:0)

进入循环时j的值是多少?

我同意其他人的意见:

for(int k = 0; k&lt; dictionary [k] .size(); k ++)

似乎是假的。像

这样的东西

for(int k = 0; k&lt; dictionary [m] .size(); k ++)

似乎更有意义。

答案 4 :(得分:0)

关于for循环中的测试的其他评论可能是正确的,但另外如果你第一次尝试进入循环时遇到这个段错误,那么你可能正在使用{ {1}} dictionary没有条目。

在这种情况下,vector<>具有未定义的行为(可能是段错误)。