繁体   English   中英

练习中的细分错误11

[英]Segmentation fault 11 in a Practice

我正在为我的Algorithms类进行练习,并且遇到了segmentation fault:11 line 58 segmentation fault:11 ,我不知道为什么,我的意思是,我知道对函数“ localiza”的第一个调用工作正常,但是第二个,

*i2 = localiza(v2, 0, v2.size())*

引起了细分错误,我不知道为什么。 该算法用于查找索引,使v[i] = i main() ,如果i1i2!= 0意味着v1[i1] = i1v2[i2] = i2 希望您能帮助我进行这项练习。 非常感谢你们!!

#include <iostream>
#include <vector>

using namespace std;

int localiza(vector <int> v, int primero, int ultimo){
    int i = 0;
    int izq = 0, der = 0;

    if(primero == ultimo)
        if (v[primero] == primero)
            return primero;
        else 
            return 0; // No existe el indice buscado
    else{
        i = (primero + ultimo) / 2; // Division entera

        if(v[i] == i)
            return i;
        else if(v[i] > i){
            izq = localiza(v, primero, i-1); // Primera mitad

            if(v[i] <= ultimo)
                der = localiza(v, v[i], ultimo);
            else
                der = 0;

            if(izq != 0)
                return izq;
            else if(der != 0)
                return der;
            else 
                return 0;
        }
        else{
            der = localiza(v, i+1, ultimo);

            if(primero <= v[i])
                izq = localiza(v, primero, v[i]);
            else 
                izq = 0;

            if(der != 0)
                return der;
            else if(izq != 0)
                return izq;
            else
                return 0;
        }
    }
}

int main(){
    vector <int> v1 = {1, 2, 4, 5, 7, 9, 11};
    vector <int> v2 = {1, 2, 3, 4, 5, 6, 7, 7, 15, 16};

    int i1 = localiza(v1, 0, v1.size());
    int i2 = localiza(v2, 0, v2.size());

    if(i1 != 0)
        cout << "Si existe el indice indicado para el primer vector";
    else
        cout << "No existe el indice indicado para el primer vector";

    if(i2 != 0)
        cout << "Si existe el indice indicado para el segundo vector";
    else
        cout << "No existe el indice indicado para el segundo vector";

    return 0;
}

您使用[]访问v导致超出范围的访问。 由于将矢量的大小作为潜在的上限传递,因此腐烂开始了。

如果使用v.at(i)而不是v[i]则要求C ++在这种情况下引发异常,而不是未定义程序行为。 然后,您将能够解决问题,原因是明确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM