Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由于map,可能出现分段故障_C++_Map_Segmentation Fault - Fatal编程技术网

C++ 由于map,可能出现分段故障

C++ 由于map,可能出现分段故障,c++,map,segmentation-fault,C++,Map,Segmentation Fault,我写了一个代码,必须以两个字符串作为输入。它必须输出一个单词转换成另一个单词所需的步骤数、相邻字母翻转或第一个和最后一个字母翻转。它给出正确的值,直到字符串的大小为8。如果字符串的大小大于8,则会出现分段错误。我没有发现任何错误。谁能帮帮我吗。提前谢谢。代码如下: map<string,int>imap; int easyStrings(string a, string b) { //cout<<a<<endl; if(a.compare(

我写了一个代码,必须以两个字符串作为输入。它必须输出一个单词转换成另一个单词所需的步骤数、相邻字母翻转或第一个和最后一个字母翻转。它给出正确的值,直到字符串的大小为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.insertpaira,-2;中显示错误;。它还提供了一个巨大的跟踪,显示了主要与malloc有关的问题


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

用gdb粗略地看一下这个函数,就会发现这个函数是递归的,超过一定长度的字符串会触发它进入无限深度递归,或者至少是4 Gig RAM无法处理的深度。我将查看您的递归条件,并仔细检查它们是否都满足退出条件。

好的,您是否在调试器中仔细检查了代码以查看异常发生的位置?您确定您有足够的RAM来处理8 nPr 8的递归深度吗?每次调用easyStrings时,声明的所有新字符串都会占用越来越多的堆空间。它不会进入无限循环,但我觉得没有足够的内存分配是唯一可能的原因。非常感谢。