IN102/C : Allocation dynamique
Groupe ESIEE, Denis BUREAU, mai 2005.
A) Comparaison avec Java
- En java :
public class Complexe { private double re, im; public ... }
Complexe c = new Complexe( 1.0, -2.0 );
- En C :
typedef struct { double re, im; } Complexe;
typedef Complexe * PdeComplexe;
PdeComplexe pc = (PdeComplexe)malloc( sizeof(Complexe) );
pc->re = 1.0; pc->im = -2.0;
B) Types simples
- typedef char * PdeCaractere;
PdeCaractere pc = (PdeCaractere)malloc( sizeof(char) );
typedef int * PdEntier;
PdEntier pe = (PdEntier)malloc( sizeof(int) );
- malloc renvoit NULL s'il échoue
(par exemple si le système n'a pas trouvé suffisamment de place
contiguë en mémoire);
il serait donc plus sage de toujours faire suivre
l'instruction p = malloc( ... );
des instructions
if (p==NULL) { printf( "message d erreur\n" ); exit(1); }
- pas de Garbage Collector en C; on doit donc
désallouer/libérer/rendre la mémoire au système :
free( pc );
libère la mémoire pointée par pc (ne modifie pas pc)
pc doit avoir été initialisé par un malloc
*pc est ensuite interdit, mais pc=malloc(...); autorisé
- pour utiliser toutes ces possibilités, il faut inclure
<stdlib.h>.
C) Tableaux dynamiques
- taille fixe, mais choisie à l'exécution
(équivalents aux tableaux java);
- int N; printf( "N ? " ); scanf( "%d", &N );
PdEntier pe = (PdEntier)malloc( N * sizeof( int ) );
on peut ensuite utiliser pe[0] à pe[N-1]
- free( pe ); désalloue tout le tableau d'un coup
- cas particulier : 1 caractère = 1 octet
typedef char * PdeCaractere;
#define MAX 20
const PdeCaractere pc = (PdeCaractere)malloc( MAX+1 );
équivalent à
char pc[MAX+1];
D) Tableaux dynamiques multi-dimensionnels
- impossible directement;
créer un tableau dynamique mono-dimensionnel et
une fonction d'accès à plusieurs indices
- Exemple :
typedef int * Matrice;
définir ou saisir le nb de lignes (NL)
et le nb de colonnes (NC)
Matrice m = (Matrice)malloc( NL*NC*sizeof(int) );
- m[4][1] pour accéder à la 2ème case de
la 5ème ligne ? NON, car :
m[4][1] = *(m[4]+1) = *( *(m+4) + 1 ) = *(4+1) = *5
- Matrice acces( Matrice tab, int nbC, int numL, int numC )
{ return tab + numL*nbC + numC; }
on peut donc écrire
*acces( m, 3, 4, 1 ) = -13;
E) Listes chaînées dynamiques
-
Comment créer une structure contenant un pointeur sur
une structure que l'on est en train de définir ?
- typedef struct MaillonTmp * PtrMaillon;
(alors que la structure n'est pas encore définie !)
typedef struct MaillonTmp
{ int element; PtrMaillon suivant; } Maillon;
- PtrMaillon pm = (PtrMaillon)malloc( sizeof(Maillon) );
pm->element = 10;
pm->suivant = (PtrMaillon)malloc( sizeof(Maillon) );
pm->suivant->element = 20;
pm->suivant->suivant = (PtrMaillon)malloc( sizeof(Maillon) );
pm->suivant->suivant->element = 30;
pm->suivant->suivant->suivant = NULL;
File translated from
TEX
by
TTH,
version 3.40.
On 09 May 2005, 19:57.