【问题标题】:C++ segmentation-fault problemC++ 分段错误问题
【发布时间】:2009-09-03 21:21:31
【问题描述】:

我的程序崩溃了,这对我来说似乎很好,当然我的程序不是这样,这让我感到困惑。

我目前正在处理的函数的这个 sn-p:

        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;
            }
        }

可能是问题所在。当我调试问题时,调试器会转到 sn -p 中的第一行:

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

然后当我尝试进入下一个时崩溃。 在调试器中,这个窗口在我的代码块中打开:

Signal Received

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

我点击了“是”,这对我来说似乎是任意的。

有谁知道我做错了什么?

如果需要回溯(窗口显示调用堆栈),如果需要,我稍后会对其进行编辑

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

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 {
        //...
        }
    }
}

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

【问题讨论】:

  • 我认为我们需要多看一点。片段和字典是如何声明和初始化的?崩溃时 i、j 和 k 的值是多少?

标签: c++ segmentation-fault


【解决方案1】:

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

【讨论】:

  • 我的意图实际上是 dictionary.size(),谢谢,但由于某种原因,我仍然收到同样的错误。
【解决方案2】:

这一行:

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

看起来确实很可疑。您确定不想循环到字典数组/集合的大小吗?

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

【讨论】:

  • 字典是一个向量,我明白为什么它有点问题
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    我同意其他人的观点:

    for(int k = 0; k

    似乎是假的。类似的东西

    for(int k = 0; k

    似乎更有意义。

    【讨论】:

      【解决方案5】:

      关于 for 循环中的测试的其他 cmets 看起来可能是正确的,但此外,如果您在第一次尝试进入循环时遇到此段错误,那么您可能正在使用 @ 987654321@ vector&lt;&gt; 没有条目。

      在这种情况下,dictionary[0].size() 具有未定义的行为(很可能是段错误)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-03
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多