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 :

pb de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut pb de pointeurs
    Bonjour,

    Voila la je commence a fatiguer,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct _Ligne Ligne
    struct _Ligne
    {
     char s[60];
    };
    dans la fonction main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Ligne * buffer = NULL;
    void mafonction(&buffer);
    free(buffer);
    dans ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void mafonction(Ligne ** buffer)
    {
     static int tailleBuffer=0;
     
    //tailleBuffer evolue dans la fct mais j'ai simplifié le code mais tailleBuffer est non nulle et supérieur à 3
     
     *buffer = realloc(*buffer,sizeof(Ligne)*tailleBuffer);
     
    buffer[2]->s[0]='a';//erreur de segmentation
     
    }
    La je m'embrouille, j'aimerais savoir comment on peut allouer et initialiser buffer dans mafonction et libérer dans la fonction main.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Je dirais

  3. #3
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    selon ddd, l'allocation est bien effectué mais buffer[2] pointe sur n'importe quoi ! c pas un pb de type

    *buffer =>4
    buffer => 60

  4. #4
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    nan tailleBuffer n'est pas nulle j'ai pas mis le code pour affecter une valeur a tailleBuffer pour des soucis de lisibilité

  5. #5
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Gruik
    Je dirais
    je vois pas la différence entre

    (*buffer[2]).s[0] = 'a';
    et
    buffer[2]->s[0]='a';

    (*variable).champ == variable->champ Enfin je crois

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Le problème vient certainement de l'appel à la fonction realloc().
    Tu lui passes un pointeur non initialisé.

  7. #7
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    *buffer == NULL donc y'a pas de problème

    l'erreur vient de l'affectation

  8. #8
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gnto
    *buffer == NULL donc y'a pas de problème

    l'erreur vient de l'affectation
    Oui en effet, dans ce cas là c'est équivalent à un malloc. Au temps pour moi...

  9. #9
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    tailleBuffer = 0;

    realloc(*buffer,sizeof(Ligne)*tailleBuffer);

    sizeof(Ligne)*tailleBuffer = 0;
    Donc tu n'alloue pas grand chose la.

  10. #10
    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 gnto
    Voila la je commence a fatiguer,
    Moi aussi. Ne pas recopier le code, mais faire un copié/collé. C'est plein de bugs inutiles...

    A part ça, si tailleBuffer vaut 0, sizeof(Ligne)*tailleBuffer vaudra 0, donc realloc() va retourner NULL (jamais testé...)

    Comportement indéfini.

    De plus, si tu veux écrire en buffer[2], il faut que tailleBuffer soit > 2... (jamais testé...).

    De toutes façons, cette conception est atroce (Force 9).

    http://emmanuel-delahaye.developpez.com/goret.htm

    Pour faire un tableau souple, il faut utiliser une structure qui regroupe
    • l'adresse de base du tableau
    • sa taille
    Ici, ce serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct tabdyn
    {
       Ligne *p_lines;
       size_t nb_lines;
    };

  11. #11
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Moi aussi. Ne pas recopier le code, mais faire un copié/collé. C'est plein de bugs inutiles...
    Ah oui ? j'ai recopié par souci de simplification et pour aller à l'essentielle.

  12. #12
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par gnto
    Ah oui ? j'ai recopié par souci de simplification et pour aller à l'essentielle.
    Oui mais la par exemple en recopiant tu as glisser des erreurs dans ton code (oubli de ;, appel de fonction avec void devant).

    Donc c'est plus simple de faire un copier/coller.

  13. #13
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    A part ça, si tailleBuffer vaut 0, sizeof(Ligne)*tailleBuffer vaudra 0, donc realloc() va retourner NULL (jamais testé...)

    Comportement indéfini.
    Citation Envoyé par gnto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void mafonction(Ligne ** buffer)
    {
     static int tailleBuffer=0;
     
    //tailleBuffer evolue dans la fct mais j'ai simplifié le code mais tailleBuffer est non nulle et supérieur à 3
     
     *buffer = realloc(*buffer,sizeof(Ligne)*tailleBuffer);
     
    buffer[2]->s[0]='a';//erreur de segmentation
     
    }
    Il me semble que j'avais laissé un commentaire

  14. #14
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    les static sont a utiliser en dernier recours car ils sont défini en mémoire pendant la durée de tout le programme, a l'inverse des variables locales

  15. #15
    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 gnto
    les static sont a utiliser en dernier recours car ils sont défini en mémoire pendant la durée de tout le programme, a l'inverse des variables locales
    Il n'y a aucune justification pour utiliser des statiques. Apprend plutôt à programmer par contexte persistants.

  16. #16
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    comment géres-tu les flags dans une librairie si tu n'as pas de variables statiques ?

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

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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