由于地图可能导致分段错误

时间:2014-10-27 18:27:12

标签: c++ map segmentation-fault

我编写了一个代码,必须将两个字符串作为输入。它必须输出步数(相邻的字母翻转或翻转第一个和最后一个字母),它需要一个单词转换为另一个单词。它给出正确的值,直到字符串的大小为8.如果字符串的大小大于8,则给出分段错误。我找不到任何错误。任何人都可以帮助我。提前致谢。这是代码:

map<string,int>imap;

int easyStrings(string a, string b) {

    //cout<<a<<endl;
    if(a.compare(b) == 0)
        return 0;

    map<string,int>::iterator it = imap.find(a);
    if(it != imap.end())
        return it->second;

    imap.insert(pair<string,int>(a,-2));

    int min = -2;

    string str = a;


    str[0] = a[a.length()-1];
    str[a.length()-1] = a[0];

    it = imap.find(str);
    if(it == imap.end() || it->second != -2)
        min = 1 + easyStrings(str,b); 

    for(int i = 0 ; i < a.length()-1; i++)
    {
        string check = a;
        check[i] = a[i+1];
        check[i+1] = a[i];

        int steps = 0;
        it = imap.find(check);
        if(it == imap.end() || it->second != -2)    
        {
            steps = 1 + easyStrings(check,b);

            if(steps < min || min ==-2)
                if(steps > 0)
                    min = steps;
        }

    }

    imap[a] = min;
    return min; 
}

我尝试使用调试器。我在imap.insert中显示错误(pair(a,-2));.它还给出了一个巨大的痕迹,主要显示了malloc的问题。

它不会进入无限递归。输入字符串的长度最大为阶乘,我只在地图中找不到字符串。

1 个答案:

答案 0 :(得分:0)

用gdb粗略地看一下这个函数会发现这个函数是递归的,并且超过一定长度的字符串会触发它进入无限深度递归(或者至少是4 gig RAM无法处理的深度)。我会查看你的递归条件,并仔细检查是否有一个退出案例将满足所有这些条件。