IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Realloc() sur tableau de chaînes de caractères.


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 63
    Points : 50
    Points
    50
    Par défaut Realloc() sur tableau de chaînes de caractères.
    Bonsoir.
    J'essaye d'implémenter une structure contenant un tableau de chaînes de caractères, déclarée comme ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
        char ** tab;
        int size;
    }*structure;

    Instanciée comme ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    structure create_struct()
    {
        structure s = malloc(sizeof(structure));
        s->tab = NULL;
        s->size = 0;
        return s;
    }

    Lorsque je veux y insérer un élément, je procède comme ceci:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void insert (struct s, char * str)
    {   
        if((s->tab = (char**) realloc(s->tab, sizeof (s->tab) + sizeof (str)) == NULL))
            exit(EXIT_FAILURE);
     
        s->tab[s->size] = str;
        s->size ++;
    }

    une erreur de segmentation intervient au moment d'insérer un premier élément, juste après le realloc().
    Après différentes vérifications, je ne trouve pas d'où vient le soucis et cela me freine dans l'avancée de mon travail car ce n'est pas dutout le sujet.

    Merci pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    tu as défini structure comme un alias d'un pointeur, c'est à éviter car c'est trompeur, ainsi structure n'est pas une structure mais pointe sur une structure. Et dans structure create_struct() tu n'alloues pas la taille d'une structure mais la taille d'un pointeur. Il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        structure  s = malloc( sizeof(*s) );
    Dans insert() tu ne fais pas du tout les allocations nécessaires. Il te faut réallouer s->tab afin qu'il supporte une chaine de plus, et il te faut ensuite allouer l'espace pour ta chaine, puis copier dans cet espace toute ta chaine. Et le calcul de ta taille ne correspond à rien sizeof(s->tab) + sizeof(str) c'est la somme de la taille de 2 pointeurs, ça vaut donc 8 (ou 16). Tu as bien vu qu'il faillait allouer 2 choses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void  insert( structure s, char* str ) {
        if ( (s->tab = realloc( s->tab, (s->size+1)*sizeof(char*) ) == NULL )
            exit( EXIT_FAILURE );
        if ( ( s->tab[s->size] = malloc( strlen(str) + 1 ) ) == NULL )
             exit( EXIT_FAILURE );
     
        strcpy( s->tab[s->size], str );
        s->size++;
    }
    La modification ou la suppression d'éléments est un peu plus compliquée.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 63
    Points : 50
    Points
    50
    Par défaut
    Ça paraît évident maintenant ! Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Turbo Pascal] Opérations sur un tableau de chaînes de caractères
    Par erico552 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 14/08/2017, 18h09
  2. Réponses: 13
    Dernier message: 18/07/2007, 09h01
  3. Tableau de chaînes de caractères
    Par sone47 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2007, 14h54
  4. tableau de chaîne de caractères
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 17h23
  5. Tableau de chaînes de caractères
    Par mac1 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2006, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo