Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème allocation de mémoire

    17 septembre 2023 à 10:59:38

    J'ai la fameuse erreur 0xC0000005, j'ai réussi à cibler l'erreur, cependant impossible de la résoudre

    Le code est en c, ici le header

    //
    // Created by Scotch on 13/09/2023.
    //
    
    #ifndef TD1_HEADER_H
    #define TD1_HEADER_H
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Sommet{
        char *nom;
        int numsommet;
    }t_sommet;
    
    typedef struct Graphe{
        int **matrice;
        int ordre;
        t_sommet *sommet;
    }t_Graphe;
    
    t_sommet init_sommet(int numsommet, char nom[]);
    void init_graphe(int ordre, t_Graphe *graphe);
    void lecture(char nomfichier[],t_Graphe *graphe,t_sommet *Sommet);
    void influence(t_Graphe *graphe);
    #endif //TD1_HEADER_H

    et là le .c

    #include "header.h"
    
    
    t_sommet init_sommet(int numsommet, char nom[]){
        t_sommet Sommet;
    
        int longueur = strlen(nom);
        Sommet.nom = malloc(longueur * sizeof (char));
        strcpy(Sommet.nom, nom);
        Sommet.numsommet = numsommet;
        return Sommet;
    }
    
    void init_graphe(int ordre, t_Graphe *graphe){
        graphe->ordre=ordre;
        graphe->matrice= malloc(ordre * sizeof (int*));
        graphe->sommet = malloc(ordre * sizeof (int));
        for(int i=0; i<ordre; i++){
            graphe->matrice[i] = calloc(ordre,sizeof (*graphe->matrice[i]));
    
        }
    }
    
    void lecture(char nomfichier[],t_Graphe *graphe,t_sommet *Sommet){
        FILE *fichier = NULL;
        int ordre=0;
        char nom [15];
        fichier = fopen(nomfichier, "r");
        if (fichier != NULL)
        {
            printf("marche");
            // On peut lire et écrire dans le fichier
        }
        else
        {
            // On affiche un message d'erreur si on veut
            printf("Impossible d'ouvrir le fichier");
        }
        fscanf(fichier, "%d", &ordre);
        init_graphe(ordre,graphe);
    
        for(int i=0; i<7; i++){
            int sommet=0;
            fscanf(fichier,"%d %s",&sommet,nom);
            fflush(stdin);
            graphe->sommet[i] = init_sommet(sommet,nom);
            printf("%d %s \n",graphe->sommet[i].numsommet, graphe->sommet[i].nom);
        }
       /* for(int i=0; i<7; i++){
            int a=0; int b=0;
            fscanf(fichier,"%d %d",&a, &b);
            graphe->matrice[a][b]=1;
        }*/
            free(fichier);
    }
    
    void influence(t_Graphe *graphe){
        for(int i=0; i<7; i++){
            for(int j=0; j<7; j++){
                if(graphe->matrice[i][j]==1){
                    printf("%s influence %s", graphe->sommet[i].nom, graphe->sommet[j].nom);
                }
            }
        }
    }
    
    
    int main() {
        t_Graphe *Graphe = NULL;
        t_sommet *Sommet = NULL;
        Graphe = malloc(sizeof (t_Graphe));
        char nomfichier[50];
        printf("Saisissez le nom du fichier :");
        scanf("%s", nomfichier);
        printf("\n %s", nomfichier);
        lecture(nomfichier,Graphe,Sommet);
        influence(Graphe);
        return 0;
    }





    L'erreur arrive lorsque i = 6 dans la fonction lecture, et plus particulèrement ligne 8 lorsqu'on veut allouer Sommet.nom dans le sous programme init_sommet

    Ca fait 1h que je refléchi à ce qui pourrait causer ce pb / résoud d'autres soucis sur mon code mais là j'avoue que je suis à cours d'idée et j'aurais bien besoin d'un petit coup de main.

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2023 à 12:49:09

      Salut,

      Dans init_sommet, tu alloues "longueur" pour ta chaine, il faut allouer longueur+1 pour bien avoir le \0 terminal.

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        17 septembre 2023 à 14:49:52

        Ah, bon, merci j'ai l'air bête
        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2023 à 23:12:49

          RaphaelDuport a écrit:

          Ah, bon, merci j'ai l'air bête

          Bonjour,

          Sujet résolu

          Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

          • Partager sur Facebook
          • Partager sur Twitter
            19 septembre 2023 à 8:43:46

            On peut utiliser strdup, pour dupliquer une chaîne.

            Ça supprime une occasion de faire une étourderie dans du code tellement évident qu'on n'y prête plus attention. Et que le cerveau refuse de relire quand on cherche pourquoi le code qu'on a écrit  plante (*). Phénomène courant, la vie de tous les jours des gens qui programment.

            Sommet.nom = strdup(nom);

            (1) dans le code des autres, ça saute aux yeux, évidemment.

            -
            Edité par michelbillaud 19 septembre 2023 à 8:58:37

            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2023 à 9:29:17

              Salut,

              Quand on voit des malloc dans un code on cherche les free correspondants... Qu'essaies-tu de faire ligne 54 ?

              Bonne continuation.

              • Partager sur Facebook
              • Partager sur Twitter

              Problème allocation de mémoire

              × 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