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+