特定情况下的分段故障

时间:2018-03-30 19:44:22

标签: c segmentation-fault stack-overflow

大家好我是一名C学习者,我编写了一个程序来解决最短路径问题(简单版本)(通过实现模拟退火算法)但我在执行时遇到问题。当我在Code :: blocks中运行调试器时,它在行混合器中给了我分段错误(参见代码),但我不知道为什么。现在令人惊讶的是,当我移除循环或设置特定数字(测试100次迭代)时,它正确运行,但是当我将其设置为高(例如1000)时它会停止。那么您认为导致问题的是什么(如果您希望看到我可以发布的完整代码,我只是不知道如何使用法语写的大部分内容,请原谅我)。任何帮助表示赞赏。链接到项目:https://gist.github.com/melkanas/a1909439f6c3f9a33b8552a04ddadd77 编辑::我认为这是一个stackoverflow错误,因为问题只有在我尝试大量迭代(而不是无限)时才会发生。

    srand(time(NULL));
    double temperature = (double) 1000;
    int choix = 1; //choice
    int i = 0;
    Tour *Trajet =NULL;
    Tour *Meilleur = NULL; // the best solution
    Tour *nouveauTour =NULL; //the new randomly generated combination
    Tour *nettoyer = NULL; // to free memory of old (not referenced anymore)
    int tailleTrajet =0;
    double probalea =0; // random (probability related to the algorithme
    double ratio = 0.0001; // to minimize temperature
    int nombreAleatoire = 0; // to divide the trajectory into two pieces
    printf("Creation du Tour"); //
    while(choix)
    {
        Ville *V = malloc(sizeof(Ville));
        V->nom = malloc(sizeof(char)*TAILLE_MAX);
        i++;
        printf("Ville Num %d\n",i);
        initialiserVille(V);
        Trajet = InsererEnQueue(&Trajet,*V);
        free(V);
        printf("votre choix (0/1): ");
        scanf("%d",&choix);
    }
    printf("Tour initiale: \n");
    AffichageTour(Trajet);
    printf("\nAvec une distance de %lf",distanceTour(Trajet));
    Meilleur = Trajet;
    tailleTrajet = Trajet->taille;
    int q =1; // this is just to count the number of iteration before the 
              //program stops
    //this part underneath is where the mess
    while(temperature>1)
    {
        nombreAleatoire = (int) rand()%(tailleTrajet-1) +1;
        nouveauTour = mixer(Trajet,nombreAleatoire); // creates a new 
                                            //Trajectory (allocates memory)
        probalea = rand()/(double)RAND_MAX;
        double pro = probabilite(distanceTour(Trajet),distanceTour(nouveauTour),temperature);
//returns 1 if new Trajectory is best(short or long but has a good probability) //else 0
        if(pro>probalea )
        {
            Trajet = nouveauTour;
        }
        else
        {
            Liberer(nouveauTour); //free new generated solution(not a good solution)
            nouveauTour = NULL;
        }
        if(distanceTour(Trajet)<distanceTour(Meilleur))
        {
            nettoyer = Meilleur; // to keep the old best solution
            Meilleur = Trajet; // move to the new best
            Liberer(nettoyer); // dealocate memory (last best)
            nettoyer =NULL;
        }
        temperature=temperature*((double)(1.0-ratio)); // the cast was just to make sure(after the problem occured)
        printf("\n iteration : %d",q);// minimiser la temperature
        q++;
    }
    printf("Trajet optimal :\n"); // shows the best(shortest) trajectory
    AffichageTour(Meilleur);
    printf("\nAvec une distance de %lf",distanceTour(Meilleur));

1 个答案:

答案 0 :(得分:0)

我发现问题与stackoverflow无关,或者它只是结构的一个属性,它是一个整数,在函数混合器中没有初始化。