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:
1ère question: que devient le pointeur tmp?
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 */ }
Si par ex. je faisavant de faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part free((void *)tmp);est-ce que p est réutilisable (ie non NULL)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part free((void *)p);
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.
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 : 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 */ }
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 unavant de faire realloc, j'ai la mm adresse en hexadécimal...
Code : Sélectionner tout - Visualiser dans une fenêtre à part printf("%p %p\n", tmp, p)![]()
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+
Partager