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 :

Utilisation de realloc et des pointeurs [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Par défaut Utilisation de realloc et des pointeurs
    Bonsoir!

    Dans mon listing en C, j'ai un pbm de "segmentation fault", surement à cause de la libération d'un pointeur NULL...

    Mon pbm est de réallouer de la mémoire (augmentation de la taille) via un pointeur temporaire afin de gérer au cas où une erreur de réallocation et de ne pas perdre au final le bloc mémoire...

    mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    double * p, * tmp;
     
    p = (double *)malloc(100*sizeof(double)); // on alloue le ptr principal p
     
    if (p != NULL) {
        ...                                 /* on utilise la zone mémoire allouée */
        tmp = (double *)realloc(p,  200*sizeof(double));   //on étend la zone allouée */
        if (tmp != NULL) p = tmp;
        ...                                 /* on utilise la nouvelle zone */
        free((void *)p);                    /* on désalloue la mémoire */
    }
    1ère question: que devient le pointeur tmp?
    Si par ex. je fais avant de faire est-ce que p est réutilisable (ie non NULL)?
    En principe je dirais non...

    2ème question: imaginons que le pointeur p soit global et le pointeur tmp local.
    Ex. de code simple à partir du précédent.

    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
    double * p;
     
    p = (double *)malloc(100*sizeof(double)); // on alloue le ptr principal p
     
    if (p != NULL) {
        ...                                 // on utilise la zone mémoire allouée 
        if (drand48() < 0.5) {      //  boucle locale quelconque
            double * tmp;           // pointeur tmp en boucle locale
            tmp = (double *)realloc(p,  200*sizeof(double));   /*on étend la zone allouée */
            if (tmp!=NULL) p = tmp;
            ...                                 // on utilise la nouvelle zone
        }
     
        free((void *)p);                    /* on désalloue la mémoire */
    }
    Bref qd je sors de la boucle local, tmp n'a plus de portée (on sort du if) et donc prend la valeur NULL en théorie. Est-ce que ceci a de l'influence sur p?

    En effet, j'ai un code plus compliqué où j'augmente plusieurs fois la taille d'un tableau dynamique global (mon ptr p ici) par la fonction realloc. Du coup j'utilise un ptr temporaire tmp ds une boucle locale (la réalloc est conditionnée à un test if d'ou mon ex.). Tmp est utilisé pour éviter de perdre mon ptr p si la réalloc se passe mal. Or au bout de plusieurs passages ds la boucle if et dc de réalloc, j'ai un "segmentation fault"...
    Or en affichant via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%p %p\n", tmp, p)
    avant de faire realloc, j'ai la mm adresse en hexadécimal...

    En fait mon pbm vient de l'utilisation de 2 pointeurs qui pointent sur la mm zone mémoire.



    Merci pour votre aide éventuelle. j'espère que j'ai été clair et assez détaillé pour voir mon pbm...a+

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par acrosomia
    Dans mon listing en C, j'ai un pbm de "segmentation fault", surement à cause de la libération d'un pointeur NULL
    Il n'y a pas de probleme a ce niveau, free(NULL) est valide.

    Citation Envoyé par acrosomia
    1ère question: que devient le pointeur tmp?
    Si par ex. je fais avant de faire est-ce que p est réutilisable (ie non NULL)?
    En principe je dirais non...
    Dans ce cas la valeur de p n'a pas ete modifie (il ne vaut donc pas nULL) mais la zone dont l'adresse est contenu dans p ayant deja ete liberee par free(tmp), cette adresse n'est plus valide et free(p) est incorrecte.

    [QUOTE=acrosomia]2ème question: imaginons que le pointeur p soit global et le pointeur tmp local.
    Ex. de code simple à partir du précédent.

    ...

    Bref qd je sors de la boucle local, tmp n'a plus de portée (on sort du if) et donc prend la valeur NULL en théorie. Est-ce que ceci a de l'influence sur p?
    [/code]

    tmp ne prends pas la valeur NULL, il n'existe tout simplement plus. La valeur de p n'est pas modifiee (pourquoi le serait-elle ?) et reste valide.

    Citation Envoyé par acrosomia
    En effet, j'ai un code plus compliqué où j'augmente plusieurs fois la taille d'un tableau dynamique global (mon ptr p ici) par la fonction realloc. Du coup j'utilise un ptr temporaire tmp ds une boucle locale (la réalloc est conditionnée à un test if d'ou mon ex.). Tmp est utilisé pour éviter de perdre mon ptr p si la réalloc se passe mal. Or au bout de plusieurs passages ds la boucle if et dc de réalloc, j'ai un "segmentation fault"...
    Or en affichant via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%p %p\n", tmp, p)
    avant de faire realloc, j'ai la mm adresse en hexadécimal...
    A priori tu dois faire appel deux fois a free avec la meme adresse (contenue dans deux pointeurs differents), c'est probablement la source de ton probleme

Discussions similaires

  1. utilisation des pointeurs de type "far"
    Par Flow_75 dans le forum C++
    Réponses: 0
    Dernier message: 25/03/2008, 07h35
  2. utilisation des pointeurs
    Par OutOfRange dans le forum Delphi
    Réponses: 5
    Dernier message: 27/12/2006, 11h27
  3. utilisation des pointeur
    Par nixonne dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2006, 09h19
  4. Optimiser l'utilisation des pointeurs
    Par progfou dans le forum C
    Réponses: 65
    Dernier message: 10/03/2006, 11h49
  5. Réponses: 6
    Dernier message: 21/02/2006, 16h47

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