Bonjour, voici le code suivant :

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
 
#include<stdio.h>
#include<stdlib.h>
 
int main(void)
{
  int * p = malloc(3*sizeof(*p));
  if(p==NULL)
  {
    fprintf(stderr,"erreur\n");
	exit(1);
  }
 
  int * q=p;
 
  free(q); q=NULL;
  //free(p); p=NULL;
 
  printf("c'est fini\n");
  return 0;
}
Si j'enlève la ligne qui est en commentaire, alors mon code tourne jusqu'au bout bien que l'erreur suivante s'affiche sur mon terminal

out(287) malloc: *** error for object 0x5000f0: double free
out(287) malloc: *** set a breakpoint in szone_error to debug
c'est fini
Je comprends tout à fait que la prgm plante car je libère une zone mémoire déjà libérée. Mais pourquoi le prgm s'exécute jusqu'au bout bien qu'il y ait une erreur pendant son exécution ?

Y a-t-il une technique pour remettre le pointeur p à NULL : plus généralement, y a-t-il une manière de structurer les données de telle manière que si je libère une zone de la mémoire, alors tous les pointeurs pointant sur celle-ci se mettent à NULL automatiquement ? Ou dois-je tout faire "à la main" ?

Merci.