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

  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 : 42
    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
    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.

  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 : 42
    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

  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 : 42
    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é

  6. #6
    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 : 42
    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

  7. #7
    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é.

  8. #8
    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 : 42
    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

  9. #9
    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...

  10. #10
    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 : 42
    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
    qd je créé une variable temp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void mafonction(Ligne ** buffer)
    {
     Ligne * temp;
     static int tailleBuffer = 0;
     
     ...
     
     temp = malloc(temp,sizeof(Ligne)*tailleBuffer);
     
     temp[2]->s[0] = 'a'; // la ca fonctionne
     
    }
    le probleme c'est que je n'ai pas de retour

  11. #11
    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
    Pourquoi tu ne fais pas quelque chose de plus simple du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Ligne *mafonction(void)
    {
        static Ligne *buffer = NULL;
        static int tailleBuffer=3;
     
        if ( (buffer = realloc(buffer,sizeof(Ligne)*tailleBuffer)) != NULL)
        {
            buffer[2].s[0]='a';
        }
        return buffer;
    }
     
    int main(void)
    {
        [...]
        Ligne * buffer = NULL;
        buffer = mafonction();
        free(buffer);
        [...]
        return 0;
    }

  12. #12
    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 : 42
    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
    j'attendais la question,

    j'aimerais avoir une signature de ce type

    int mafonction(Ligne ** buffer,size_t count)

  13. #13
    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
    Tout ca pour dire que la solution t'avais ete donné par Gruik

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct _Ligne Ligne;
    struct _Ligne
    {
        char s[60];
    };
     
    void mafonction(Ligne ** buffer)
    {
        static int tailleBuffer=5;
     
        //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';
    }
     
    int main(void)
    {
        Ligne * buffer = NULL;
        mafonction(&buffer);
        free(buffer);
    	return 0;
    }

  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 : 42
    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
    peut on me donner la difference entre

    (*variable).champ et variable->champ

    parce que j'ai toujours cru que c'étais la même chose !!

    J'allais oublier de vous remercié tous.

  15. #15
    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
    peut on me donner la difference entre

    (*variable).champ et variable->champ

    parce que j'ai toujours cru que c'étais la même chose !!

    J'allais oublier de vous remercié tous.
    C'est effectivement la meme chose, c'est juste une ecriture simplifié.

    Mais ici avec ton probleme
    (*buffer)[2]...
    (*buffer[2])...
    *buffer[2]...

    Ce n'est pas la meme chose. Quand tu as un doute avec la priorité des opérateurs met des parenthèses.

  16. #16
    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;
    };

  17. #17
    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 : 42
    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.

  18. #18
    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.

  19. #19
    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 crocodilex
    Pourquoi tu ne fais pas quelque chose de plus simple du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Ligne *mafonction(void)
    {
        static Ligne *buffer = NULL;
        static int tailleBuffer=3;
    Goretisation de force 9 !
    http://emmanuel-delahaye.developpez.com/goret.htm

  20. #20
    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
    peut on me donner la difference entre

    (*variable).champ et variable->champ

    parce que j'ai toujours cru que c'étais la même chose !!
    Certes, mais le problème, c'est que tu as dans ton code une atrocité appelée 'douple pointeur', qu'il est préférable de fuir pour ne pas avoir ces écritures gores...

    Je recommande fortement l'usage de la structure qui nous ramènes à des choses connues et lisibles du style : p->element...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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