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 :

Problème de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 74
    Par défaut Problème de pointeurs
    Bonjour,
    Voici mon problème :
    Je créer un tableau de char : char buf[1000];
    je créer un tableau de pointeurs : char* table [ nb_idents ];
    Je demande la saisie dans le buffer : scanf("%s",buf);
    je met la valeur du buffer dans mon tableau :
    table[tailleTab]=(char*) malloc(sizeof(char*)*strlen(buf));
    table[tailleTab]=buf;

    j'incremente la taille de mon tableau : TailleTab+=1;
    et je boucle pour revenir sur la demande de saisie.

    Mon problème est que quand je rentre une deuxième valeur dans mon buffer, mon tableau Table prend imédiatment la valeur de mon buffer, donc j'en conclue que je met l'adresse de mo buffer dans le tableau...
    Ma question est la suivante : comment mettre simplement la valeur de mon buffer dans mon tableau?

    Merci pour les réponses que vous pourrez m'apporter

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tout simplement en faisant une recopie des données saisies par le scanf.
    En fait, ici, tu perds de la mémoire, car le malloc demande de la mémoire au système, qui te retourne une adresse stockée dans Table[tailleTab] à cause du Table[TailleTab] =(char*) malloc(sizeof(char*)*strlen(buf));
    mais comme ensuite tu fais table[tailleTab]=buf; l'adresse précédemment mémorisée est perdue (c'est ce qu'on appelle une fuite mémoire).
    Deuxième erreur, tu stocke toujours la même adresse celle de buf, donc à la fin de la saisie, les données mémorisée par l'intermédiaire du tableau sont toutes les mêmes.
    Troisième erreur , il ne faut pas oublier que les chaînes de caractères valides se terminent par un \0, il faut le compter dans l'allocation mémoire.
    Quatrième "erreur" : sizeof char vaut 1 par définition, tu peux te contenter d'une malloc(strlen(buf) + 1);
    Cinquième erreur : on ne caste pas en C !
    Tu as deux possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     table[tailleTab]= malloc(strlen(buf)+ 1);
    strcpy(table[tailleTab], buf);
    ou tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     table[tailleTab]= strdup(buf);
    Ne pas oublier de libérer la mémoire (car strdup en fait fait la première possibilité) à la fin du programme.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 230
    Par défaut
    effectivement, tu fais pointer l'élément de ton tableau sur la même zone mémoire que ton buffer. Pour solutionner ça je ferais une boucle sur ton buffer et copierai caractère par caractères dans ton tableau.
    Solution pas terrible je sais mais ça fait tellement longtemps que je n'ai pas fais de C.

    A ce que je vois un expert à répondu plus vite que moi hi hi hi

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 74
    Par défaut
    Merci bien pour vos réponse je vais régler mes erreur

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Guizmo95 Voir le message
    Voici mon problème :
    Je créer un tableau de char : char buf[1000];
    je créer un tableau de pointeurs : char* table [ nb_idents ];
    Je demande la saisie dans le buffer : scanf("%s",buf);
    je met la valeur du buffer dans mon tableau :
    table[tailleTab]=(char*) malloc(sizeof(char*)*strlen(buf));
    table[tailleTab]=buf;
    Bug. C'est pas comme ça qu'on affecte le contenu d'un tableau. Comme c'est une chaine de caractères, utilise strcpy().

    Mais le plus simple est encore d'utiliser directement strdup() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       table[tailleTab] = strdup (buf);
    Cette fonction n'est pas standard C, mais elle est POSIX.1, donc très portable. La libération se fait par free().

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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