Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur (0xC0000005)

Sujet résolu
    11 mai 2019 à 0:56:45

    Bonjour,

    J'essais de manipuler des pointeur dans une sorte de liste chaînée mais à chaque fois que je lance mon programme j'obtiens l'erreur 0xC0000005. J'ai lu qu'il s'agissait d'une erreur d'accès à la mémoire, mais la ligne qui pose problème (la 24eme) est exactement la même qu'une précédente (10eme) qui fonctionne. 

    Je laisse un bout du code si ça peut vous aider:

    void addElem(Automate *a){
        char str1[50];
        char str2[50];
        printf("\nQuestion pour identifier l'element:\n");
    
        fflush(stdin);
        gets(str1);
    
        Etat *newEtat;
        newEtat = (Etat*) malloc (sizeof(Etat));
        strcpy(newEtat->etat, str1);
        newEtat->opt1 = NULL;
        newEtat->opt2 = a->courant;
    
        printf("Nouvel element:\n");
        fflush(stdin);
        gets(str2);
    
        Etat *newFinal;
        printf("toto");
    
    
        ///JUSTE LA    
        newFinal = (Etat *) malloc (sizeof (Etat));
        ///JUSTE LA    
    
        printf("toto");
        strcpy(newFinal->etat, str2);
        newFinal->opt1 = NULL;
        newFinal->opt2 = NULL;
    
        newEtat->opt1 = newFinal;
    
        if(a->courant == a->precedent->opt1)
            a->precedent->opt1 = newEtat;
        else
            a->precedent->opt2 = newEtat;
    
    
        a->etatFinals.tab[a->etatFinals.nbElem++] = newFinal;
    
    }

    Merci d'avance pour vos réponses.

    -
    Edité par ConanGuy 11 mai 2019 à 0:57:41

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 mai 2019 à 11:35:10

      (ง͟ʖ)ง as-tu vraiment besoin d'un cast (Etat *)? Peut-être que le tableau de type Etat newFinal est mal utilisé plus loin...
      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2019 à 15:05:11

        Bonjour,

        Lignes 6 et 16, prudence avec fflush(stdin), cela n'est pas portable et peut causer un bug sur certains systèmes.

        Lignes 7 et 17, l'utilisation de la fonction gets est aujourd'hui banni, car elle introduit une faille de sécurité dans le programme.

        Lignes 9 et 10, et 19 et 24, il est inélégant, et interdit par certaines normes de qualité de code, de définir une variable sans l'initialiser. C'est d'autant plus dommage que les variables sont ici affectées juste après leur définition.

        Enfin, tout cela n'est sans doute pas lié à ton bug. S'il y a un crash à l'appel de malloc (ou de free), cela signifie que le programme a corrompu les données en mémoire utilisées par malloc (ou free). Malheureusement, ça a pu arriver n'importe où avant dans l'exécution du programme. Relire attentivement le code serait doute bénéfique. Mais aussi utiliser un outil spécialisé dans la détection de bugs en rapport avec la mémoire, comme Valgrind.

        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2019 à 15:40:40

          Es-tu sûr de la ligne? tes printf("toto") risquent d'être un mauvais signal (à remplacer à minima par fprintf(stderr,"toto\n"); qui est non bufferisé)
          Et peux-tu nous fournir la définition des types Etat et Automate ?
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            11 mai 2019 à 20:58:28

            Finalement j'ai repris une partie du code et modifier ma façon de faire et tout fonctionne comme il faut !

            Merci quand même pour vos réponses, j'en tiendrais compte à l'avenir !

            • Partager sur Facebook
            • Partager sur Twitter

            Erreur (0xC0000005)

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown