Bonjour,
c'est la discipline de base en langage C: allouer la mémoire et la libérer.
si ton programme marche c'est par hasard. Le pointeur à une valeur
par défaut définie par le compilateur qui est "gentil" dans ton cas.
(c'est pas gentil du tout en fait de te faire croire que ça marche)
si ta boucle va suffisamment loin tu finiras fatalement par faire planter ton
programme.
comment faire un programme qui fait tout planter:
déclarer un pointeur, lui donner la valeur 0, initialiser la mémoire sur laquelle il pointe par memset avec une taille qui représente
la taille de la ram de la machine: ça efface toute la mémoire disponible au programme, si c'est toute la mémoire.
lorsque l'on programmez en mode réel du µpro c'était fatal; il fallait éteindre la machine et la rallumer. Avec le mode protégé, une alerte interrompt le programme avant qu'il détruise tout.
Pour limiter ces problèmes à répétition lors de la programmation, une solution
consiste à encapsuler l'appel aux fonctions malloc et free dans un type défini
par typedef. On utilise des méthodes pour manipuler le type qui sont des pointeurs
de fonctions. C'est une façon de programmer dans un style objet mais en C.
Exemple avec un type "Element" de liste (Liste est un autre type)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| typedef long nListe;
typedef struct Element
{
char *val; /* valeur de l'élément */
short lg; /* taille de l'element */
} Element;
typedef struct ListeSimple
{
char nom[9]; /* nom de la liste (facilite le debuggage) */
char chemin[TAILLE_CHEMIN]; /* chemin du fichier de sauvegarde de la liste FP 17/03/2002*/
Element *elt; /* tableau des éléments */
nListe taille; /* nombre d'éléments dans le tableau */
nListe tailleMaximum; /* taille maximum d'éléments dans le tableau */
int (*Chercher)(); /* méthode de recherche des éléments */
enreg enr; /*enregistrement éventuellement associé à la liste */
} ListeSimple; |
allocation de l'élément dans une fonction de Liste par malloc:
1 2 3 4 5 6 7
| if( liste->taille < liste->tailleMaximum )
{
liste->taille++;
liste->elt[place].lg = pLongueur ? *pLongueur : strlen(valeur);
liste->elt[place].val = malloc(liste->elt[place].lg+1);
strcpy(liste->elt[place].val,valeur);
} |
libération de la mémoire de l'élément par free:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int ElementDetruire(ListeSimple *liste,nListe place)
{ /* detruit element */
nListe j /* indice de boucle */
;
if(liste->taille > 0 )
{
/* destruction d'un element */
free(liste->elt[place].val);
/* decalage des pointeurs des elements plus grands */
for (j = place ; j < liste->taille -1; j++)
{
liste->elt[j] = liste->elt[j+1];
}
liste->elt[j].lg = 0;
liste->elt[j].val = (char *) 0;
liste->taille--;
}
return VRAI;
} |
Partager