Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur de segmentation (core dumped)

Sujet résolu
    16 octobre 2019 à 15:55:09

    Bonjour,

    Je ne comprends pas mon erreur de segmentation dans mon code, elle se situe dans la fonction word_dict_destroy à la ligne :

    self->size=0;

    Ce sont des fonctions pour créer une table de hachage pour y stocker des mots du dictionnaire, pour un projet d'anagramme.

    (le main et les 3 fonctions se trouvent dans 2 fichiers différents.

    Merci d'avance !

    Voici mon main :

    int main(){
      struct word_dict *self = NULL;
    
      word_dict_create(self);
      word_dict_destroy(self);
      return 0;
    }

    Voici mes 3 fonctions :

    void word_dict_bucket_destroy(struct word_dict_bucket *bucket) {
      while(bucket->next != NULL){
        struct word_dict_bucket *aux = bucket;
        bucket = bucket->next;
        free(aux);
      }
      struct word_dict_bucket *aux = bucket;
        bucket = bucket->next;
        free(aux);
    }
    
    void word_dict_create(struct word_dict *self) {
      self = NULL;
      self = malloc(sizeof(struct word_dict));
      if(self == NULL){
        exit(0);
      }
      self->count = 0;
      self->size = 0;
      self->buckets = NULL;
    }
    
    void word_dict_destroy(struct word_dict *self) {
      size_t i = 0;
      self->size = 0;
      while(i != self->size){
        if(self->buckets[i] != NULL){
          word_dict_bucket_destroy(self->buckets[i]);
        }
        i++;
      }
      free(self);
    }




    Voici aussi mes 2 structures :

    struct word_dict_bucket {
      const char *word;
      struct word_dict_bucket *next;
    };
    
    struct word_dict {
      struct word_dict_bucket **buckets;
      size_t count;
      size_t size;
    };





    -
    Edité par RomainGENDREAU1 16 octobre 2019 à 15:59:40

    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2019 à 16:12:02

      Hello,

      word_dict_create() reçoit une copie de self, elle est donc locale à la fonction. Tu pourras modifier cette variable tant que tu veux, celane modifiera pas la variable elf du main().

      Ligne 4 du main():  tu dois passer l'adresse de self à la fonction word_dict_create(), et modifier la fonction en conséquence.

      Dans word_dict_destroy(), tu n'entreras jamias dans le while: i vaut self->size. Et tester avant tout si self != NULL ....

      -
      Edité par edgarjacobs 16 octobre 2019 à 16:13:00

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        16 octobre 2019 à 16:25:32

        edgarjacobs a écrit:

        Hello,

        word_dict_create() reçoit une copie de self,


        Je ne comprend pas vraiment, pour moi j'envoie le pointeur self qui est égal à NULL, mais si je change et que je ne dis pas qu'il est à null quand je le déclare dans le main, il va aussi envoyer une copie ?

        -
        Edité par RomainGENDREAU1 16 octobre 2019 à 16:32:58

        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2019 à 17:14:26

          Teste ceci (et revois comment fonctionne le passage des arguments aux fonctions)
          #include <stdio.h>
          #include <stdlib.h>
          
          struct t {
          	char *str;
          	struct t *next;
          };
          
          void alloc1(struct t *ptr) {
          	ptr=malloc(sizeof(*ptr));
          }
          
          void alloc2(struct t **ptr) {
          	*ptr=malloc(sizeof(**ptr));
          }
          
          int main(void) {
          	struct t *ptr=NULL;
          	
          	printf("0) ptr=%p\n",ptr);
          	alloc1(ptr);
          	printf("1) ptr=%p\n",ptr);
          	alloc2(&ptr);
          	printf("2) ptr=%p\n",ptr);
          	
          	return(0);
          }

          Ou encore ceci

          #include <stdio.h>
          #include <stdlib.h>
          
          void assign1(int a) {
          	a=3;
          }
          
          void  assign2(int *a) {
          	*a=3;
          }
          
          int main(void) {
          	int a=0;
          	
          	printf("0) a=%d\n",a);
          	assign1(a);
          	printf("1) a=%d\n",a);
          	assign2(&a);
          	printf("2) a=%d\n",a);
          
          	return(0);
          }

          -
          Edité par edgarjacobs 16 octobre 2019 à 17:21:29

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          Erreur de segmentation (core dumped)

          × 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