You are on page 1of 17

Aller au menu - Aller au contenu InformatiqueBientt...

3 568 Zros connects - 230 507 Membres inscrits Inscription Inscription rapide en 2 minutes Connexion Utilisez votre compte Accueil Cours Forums Participez tudes Emploi Boutique Les cours pharesSite WebXHTML / CS SJavascriptPHP / MySQL Ce cours existe en livre : Concevez votre site web avec PHP et MySQL Java EE (J2EE)ProgrammationLangage C Ce cours existe en livre : Apprenez programmer en C Langage C++Java Ce livre est en prcommande : Apprenez programmer en Java Java (API)PythonVB .NET Systmes d'exploitationLinux Ce cours existe en livre : Reprenez le contrle a l'aide de Linux FreeBSDGraphismePhotoshopInfographie 3DBlen derMaya BureautiqueLaTeX Ce cours existe en livre : Rdigez des documents de qualit avec LaTeX Word Tous les cours par catgoriesSite Web (206 Cours)XHTML / CSS, PHP, Divers, Forums, Hbergement, Javascript, Serveur, ID E Systmes d'exploitation (96 Cours)Linux, MacOS, Windows, BSD Mapping (31 Cours)H alf-Life, Half-Life, Warcraft, Autres Bureautique (29 Cours)Microsoft Office, Ope nOffice.org, Firefox, IRC, Divers Jeux Vido (22 Cours)HL & ses mods, Autres jeux Matriel (11 Cours)Gnral AutresBases de donnes Mobiles Site du Zro Programmation (244 Cours)AS / Flash / Flex, Algorithmique, Basic et drivs, Bibliothques, C, C++, C# / .NET, Calculatrices, IDE, Erlang, Gnral, Java, mIRC, Python, Caml / OCaml, Cocoa / Objective-C, Autres langages Graphisme (27 Cours)Dessin, Divers, Flash, Gimp, Dessin vectoriel, PhotoFiltre, Photoshop, POV-Ray Infographie 3D (25 Cours)3D Studio Max, Blender, Maya Multimdia (24 Cours)Audio, Vido, After Effects Rseaux ( 18 Cours)Gnral, Scurit Accueil des forums Site WebXHTML / CSS Javascript PHP Mapping GoldSource (HL1) Source (HL2) Communaut des zrosDiscussions gnrales Vos tudes Prsenta ion de vos projets Recrutements pour vos projets SciencesMathmatiques Physique Chimie Biologie et Gologie Autres sciences ProgrammationLangage C Langage C++ Lan gage Java Langage Python Bases de donnes Autres langages, outils et approches Matr iel et logicielsDiscussions informatiques Linux, Mac et *BSD Windows Jeux vido Gr aphisme Matriel ConcoursInnov'Game 2011 : A la gloire de Atelier de nol : "Faites votre jeu" Le Site du ZroSuggestions et Commentaires Designs du Site du Zro Tutori els du Site du Zro CoursPour rdiger et participer la rdaction d'un tutoriel, rejoig nez-nous !NewsPour partager ou participer la rdaction d'une news, rejoignez-nous !ConcoursInnov'Game 2011 : A la gloire deDernires annoncesStage CDI Ingnieur logic iel C++ (H/F FACTSET JCF CDI Dveloppeur PHP/mySQL (H/F) WEBPROD CDI Consultant MOA (H/F) Small iz beautiful pour Alfi Annonces la uneCDI 5 Dveloppeurs Java (H/F) S mall iz beautiful pour AIRP CDI Dveloppeur PHP Symfony (H/ Externis Resourcing Tout es les annonces Recrutement Bac / Bac +1BTSEcoles d'ingnieurs en informatiqueEcol es d'ingnieurs gnralistesIUTUniversitsAutres formations diplmantesCPGERecrutement Ba +2Ecoles d'ingnieurs en informatiqueEcoles d'ingnieurs gnralistesAutres formations diplmantesRecrutement Bac +3 / Bac +4Ecoles d'ingnieurs en informatiqueEcoles d'in gnieurs gnralistesAutres formations diplmantesRecrutement Bac +5DoctoratsAutres form ations diplmantesTrouvez une formation Apprenez programmer en Java32 25 Acheter Cl USB du site du Zro4 Go - 8 Go - 16 Go partir de 15,20 Acheter Concevez votre site web avec PHP et MySQL En savoir plus ? Apprenez programmer en C En savoir plus ? Reprenez le contrle l'aide de Linux En savoir plus ? Rdigez des documents de qualit avec LaTeX En savoir plus ? Tous les produits Cours Forums News Membres tudes Code web MP + Cours Nouveau ? Suivez le guide ! Site Web

XHTML / CSS Javascript PHP / MySQL Ce cours existe en livre : Concevez votre site web avec PHP et MySQL Java EE (J2EE) Programmation Langage C Ce cours existe en livre : Apprenez programmer en C Langage C++ Java Ce livre est en prcommande : Apprenez programmer en Java Java (API) Python VB .NET Systmes d'exploitation Linux Ce cours existe en livre : Reprenez le contrle a l'aide de Linux FreeBSD Graphisme Photoshop Infographie 3D Blender Maya Bureautique LaTeX Ce cours existe en livre : Rdigez des documents de qualit avec LaTeX Word Tutoriel du jour Crer un thme pour sa PlayStation 3 Rdigez un cours Tous les cours

> Le Site du Zro > Cours > Tutoriels > Programmation > C > Apprenez programmer en C ! > [Thorie] Techniques avances > L'allocation dynamique > Lecture du tutoriel L'allocation dynamique Tutoriel89 commentairesHistorique -------------------------------------------------------------------------------Informations sur le tutoriel Auteur : M@teo21 Difficult : Licence :

Plus d'informations Cr : Le 29/07/2005 00:29:36 Modifi : Le 13/10/2010 17:45:58 Avancement : 100% 89 commentaires PopularitVisualisations : 26 878 530 Apprciation des lecteurs : 28 14 88 1814 Retrouvez ce tutoriel en livre dans la boutique Publicit Historique des mises jourHier 21:17:13 Correction orthographique suite au report #4060 Le 05/03/2011 13:34:20 Corrections orthographiques (#4036). Le 11/01/2011 02:55:11 #3600, correction d'une petite faute dans le QCM PartagerImprimer Convertir en PDF Email Twitter Facebook Plus de services MySpace Google Buzz Blogger Y! Buzz MSN Live Encore plus de services Inspirez un grand coup : ce chapitre est le dernier chapitre "thorique" que vous lirez avant un bon moment De quoi va-t-on parler aujourd'hui ? On va voir comment crer une variable manuell ement (= dynamiquement). Quand on dclare une variable, on dit qu'on demande allouer de la mmoire :

Code : C 1 int monNombre = 0;

Lorsque le programme arrive une ligne comme celle-l, il se passe en fait les chos es suivantes : 1.Votre programme demande au systme d'exploitation (Windows, Linux, Mac OS...) la permission d'utiliser un peu de mmoire. 2.Le systme d'exploitation rpond votre programme en lui indiquant o il peut stocker

cette variable (il lui donne l'adresse qu'il lui a rserve). 3.Lorsque la fonction est termine, la variable est automatiquement supprime de la mmoire. Votre programme dit au systme d'exploitation : "Je n'ai plus besoin de l'e space en mmoire que tu m'avais rserv telle adresse, merci" (Nota : l'histoire ne prc ise pas si le programme dit "merci" l'OS, mais c'est tout dans son intrt parce que c'est l'OS qui contrle la mmoire ) Jusqu'ici, les choses taient automatiques. Lorsqu'on dclarait une variable, le sys tme d'exploitation tait automatiquement appel par le programme. Que diriez-vous de faire cela manuellement ? Non pas par pur plaisir de faire q uelque chose de compliqu (mme si c'est tentant ), mais plutt parce que parfois on est obligs de faire comme a. Dans ce chapitre, nous allons : Etudier le fonctionnement de la mmoire (oui, encore ! ) pour voir la taille que prend une variable en fonction de son type. Puis, nous attaquerons le gros du sujet : nous verrons comment demander manuelle ment de la mmoire au systme d'exploitation. On fera ce qu'on appelle de l'allocati on dynamique de mmoire. Enfin, nous verrons l'intrt de faire une allocation dynamique de mmoire en apprenan t crer un tableau dont la taille n'est connue qu' l'excution du programme. Il est impratif de bien savoir manipuler les pointeurs pour pouvoir lire ce chapi tre ! Si vous avez encore des doutes sur les pointeurs, je vous recommande d'all er relire le chapitre sur les pointeurs avant de commencer quoi que ce soit ! Sommaire du chapitre : La taille des variables Allocation de mmoire dynamique Allocation dynamique d'un tableau Q.C.M. Vous avez dit "programmer" ? Ayez les bons outils ! Votre premier programme Un monde de variables Une bte de calcul Les conditions Les boucles TP : Plus ou Moi ns, votre premier jeu Les fonctions La programmation modulaire A l'assaut des pointeurs Les tableaux Les chanes de caractres Le prprocesseur Crez vos propres type s de variables ! Lire et crire dans des fichiers L'allocation dynamique TP : Ralis ation d'un pendu Installation de la SDL Cration d'une fentre et de surfaces Affi cher des images La gestion des vnements (Partie 1/2) La gestion des vnements (Partie 2/2) TP : Mario Sokoban Matrisez le temps ! Ecrire du texte avec SDL_ttf Jouer d u son avec FMOD TP : visualisation spectrale du son Crer une installation Crer u ne icne pour son programme La saisie de texte scurise -------------------------------------------------------------------------------La taille des variables Selon le type de variable que vous demandez crer (char, int, double, float...), v ous avez besoin de plus ou moins de mmoire. En effet, pour stocker un nombre compris entre -128 et 127 (un char), on n'a bes oin que d'un octet en mmoire (c'est tout petit ). En revanche, un int occupe gnralement 4 octets en mmoire. Quant au double, il occup e 8 octets. Le problme est... que ce n'est pas toujours le cas. Cela dpend de votre ordinateur : peut-tre que chez vous un int occupe 8 octets, qui sait ? Notre objectif ici est de vrifier quelle taille occupe chacun des types sur votre

ordinateur. Il y a un moyen trs facile pour savoir cela : utiliser l'oprateur sizeof(). Contrairement aux apparences, ce n'est pas une fonction mais une fonctionnalit de base du langage C. Vous devez juste indiquer entre parenthses le type que vous v oulez analyser. Pour connatre la taille d'un int, on devra donc crire : Code : C 1 sizeof(int)

A la compilation, cela sera remplac par un nombre : le nombre d'octets que prend int en mmoire. Chez moi, sizeof(int) vaut 4, ce qui signifie que int occupe 4 oct ets. Chez vous, c'est probablement la mme valeur, mais ce n'est pas une rgle. Test ez, vous verrez Vous pouvez faire des printf pour afficher cela : Code : C 1 2 3 4 printf("char : %d octets\n", sizeof(char)); printf("int : %d octets\n", sizeof(int)); printf("long : %d octets\n", sizeof(long)); printf("double : %d octets\n", sizeof(double));

Chez moi, cela affiche : Code : Console char : 1 octets int : 4 octets long : 4 octets double : 8 octets Je n'ai pas mis tous les types que nous connaissons, je vous laisse le soin de t ester vous-mme la taille des autres types Vous remarquerez que long et int occupent la mme place en mmoire. Crer un long revi ent donc ici exactement crer un int, cela prend 4 octets dans la mmoire. En fait, le type "long" est quivalent un type appel "long int", qui est ici quivale nt au type... "int". Bref, a fait beaucoup de noms diffrents pour pas grand-chose au final Avoir de nombreux types diffrents tait utile une poque o on n'avait pas be aucoup de mmoire. On cherchait utiliser le minimum de mmoire possible en utilisant le type le plus adapt. Aujourd'hui, cela ne sert plus vraiment car la mmoire d'un ordinateur est trs gran de.

Peut-on afficher la taille d'un type personnalis qu'on a cr (une structure) ? Oui ! sizeof marche aussi sur les structures ! Code : C 1 2 3 4 5 6 7 8 9 10 11 12 13 typedef struct Coordonnees Coordonnees; struct Coordonnees { int x; int y; }; int main(int argc, char *argv[]) { printf("Coordonnees : %d octets\n", sizeof(Coordonnees)); return 0; }

Code : Console Coordonnees : 8 octets Plus une structure contient de sous-variables, plus elle prend de mmoire. Terribl ement logique n'est-ce pas ?

Une nouvelle faon de voir la mmoire Jusqu'ici, mes schmas de mmoire taient encore assez imprcis. On va enfin pouvoir les rendre prcis et corrects maintenant qu'on connat la taille de chacun des types de variables (c'est pas trop tt ) Si on dclare une variable de type int : Code : C 1 int nombre = 18;

... et que sizeof(int) indique 4 octets sur notre ordinateur, alors la variable occupera 4 octets en mmoire ! Supposons que la variable nombre soit alloue l'adresse 1600 en mmoire. On aurait a lors le schma suivant :

Ici, on voit bien que notre variable "nombre" de type int qui vaut 18 occupe 4 o ctets dans la mmoire. Elle commence l'adresse 1600 (c'est son adresse) et termine l'adresse 1603. La p rochaine variable ne pourra donc tre stocke qu' partir de l'adresse 1604 ! Si on avait fait la mme chose avec un char, alors on n'aurait occup qu'un seul oct et en mmoire :

Imaginez maintenant un tableau de int ! Chaque "case" du tableau occupera 4 octets. Si notre tableau fait 100 cases : Code : C 1 int tableau[100];

Alors on occupera en ralit 4 * 100 = 400 octets en mmoire Mme si le tableau est vide il prend 400 octets ? Bien sr ! La place en mmoire est rserve, aucun autre programme n'a le droit d'y touc her ( part le vtre). Une fois qu'une variable est dclare, elle prend immdiatement de la place en mmoire. Notez que si on cre un tableau de type "Coordonnees" : Code : C 1 Coordonnees tableau[100];

... on utilisera (allez c'est facile ) : 8 * 100 = 800 octets en mmoire. Il est important de bien comprendre ces petits calculs pour la suite du chapitre . C'est de la multiplication de niveau Primaire a -------------------------------------------------------------------------------Allocation de mmoire dynamique Rentrons maintenant dans le vif du sujet.

Le but du chapitre, c'tait quoi justement ? Ah oui : apprendre demander de la mmoire manuellement. On va avoir besoin d'inclure la bibliothque <stdlib.h> (si vous avez suivi mes co nseils, vous devriez avoir inclus cette bibliothque dans tous vos programmes de t oute faon ). Cette bibliothque contient 2 fonctions dont nous allons avoir besoin : malloc ("Memory ALLOCation", c'est--dire "Allocation de mmoire") : demande au systm e d'exploitation la permission d'utiliser de la mmoire. free ("Librer") : permet d'indiquer l'OS que l'on n'a plus besoin de la mmoire qu' on avait demande. La place en mmoire est libre, un autre programme peut maintenant s 'en servir au besoin. Quand vous faites une allocation manuelle de mmoire (ce qu'on va apprendre faire maintenant), vous devez toujours suivre ces 3 tapes : 1.Appeler malloc pour demander de la mmoire 2.Vrifier la valeur retourne par malloc pour savoir si l'OS a bien russi allouer la mmoire. 3.Une fois qu'on a fini d'utiliser la mmoire, on doit la librer avec free. Si on n e le fait pas, on s'expose des fuites de mmoire, c'est--dire que votre programme r isque au final de prendre beaucoup de mmoire alors qu'il n'a en ralit plus besoin d e tout cet espace. Tiens, ces 3 tapes a vous rappelle pas le chapitre sur les fichiers a ? Ben moi si Le principe est exactement le mme qu'avec les fichiers : on alloue, on vrifie si l 'allocation a march, on utilise la mmoire, puis on libre quand on a fini d'utiliser . Nous allons maintenant tudier la fonction malloc.

malloc : demande d'allocation de mmoire Le prototype de la fonction malloc est assez comique vous allez voir : Code : C 1 void* malloc(size_t nombreOctetsNecessaires);

La fonction prend un paramtre : le nombre d'octets rserver. Ainsi, il suffira d'cri re sizeof(int) dans ce paramtre pour rserver suffisamment d'espace pour stocker un int. Mais c'est surtout ce que la fonction renvoie qui est curieux : elle renvoie un. .. void* Si vous vous souvenez du chapitre sur les fonctions, je vous avais dit que "void

" signifiait "vide" et qu'on utilisait ce type pour indiquer que la fonction ne retournait aucune valeur. Alors ici, on aurait une fonction qui retourne un "pointeur sur vide" ? En voil une bien bonne ! Ces programmeurs ont dcidemment un sens de l'humour trs dvelopp Ca te drangerait pas trop de nous donner quelques explications ? Oui oui j'y viens Je me rappelle juste la premire fois que j'ai vu le prototype de malloc, je suis rest la bouche ouverte un petit moment devant mon cran avant de comprendre En fait, cette fonction renvoie un pointeur indiquant l'adresse que l'OS a rserv p our votre variable. Si l'OS a trouv de la place pour vous l'adresse 1600, la fonc tion renvoie donc un pointeur contenant l'adresse 1600. Le problme, c'est que la fonction malloc ne sait pas quel type de variable vous c herchez crer. En effet, vous ne lui donnez qu'un paramtre : le nombre d'octets en mmoire dont vous avez besoin. Si vous demandez 4 octets, a pourrait aussi bien tre un int qu'un long par exemple ! Comme malloc ne sait pas quel type elle doit retourner, elle renvoie le type voi d*. Ce sera un pointeur sur n'importe quel type. On peut dire que c'est un point eur universel. Passons la pratique. Si je veux m'amuser (hahem) crer manuellement une variable d e type int en mmoire, je devrai indiquer malloc que j'ai besoin de sizeof(int) oc tets en mmoire. Je rcupre le rsultat du malloc dans un pointeur sur int. Code : C 1 2 3 int* memoireAllouee = NULL; // On cre un pointeur sur int memoireAllouee = malloc(sizeof(int)); // La fonction malloc inscrit dans notre p ointeur l'adresse qui a t reservee.

A la fin de ce code, memoireAllouee est un pointeur contenant une adresse qui vo us a t rserve par l'OS, par exemple l'adresse 1600 (pour reprendre mes schmas de tout l'heure).

Tester le pointeur La fonction malloc a donc renvoy dans notre pointeur memoireAllouee l'adresse qui a t rserve pour vous en mmoire. 2 possibilits : Si l'allocation a march, notre pointeur contient une adresse. Si l'allocation a chou, notre pointeur contient l'adresse NULL.

Il est peu probable qu'une allocation choue, mais cela peut arriver. Imaginez que vous demandiez utiliser 34 Go de mmoire vive, il y a trs peu de chances que l'OS vous rponde favorablement Il est nanmoins recommand de tester si l'allocation a march. On va faire ceci : si l'allocation a chou, c'est qu'il n'y avait plus de mmoire de libre (c'est un cas cr itique). Dans un tel cas, le mieux est d'arrter immdiatement le programme parce qu 'il ne pourra pas continuer convenablement de toute manire. On va utiliser une fonction standard qu'on n'avait pas encore vue jusqu'ici : ex it(). Elle arrte immdiatement le programme. Elle prend un paramtre : la valeur que le programme doit retourner (a correspond au return du main()). Code : C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 int main(int argc, char *argv[]) { int* memoireAllouee = NULL; memoireAllouee = malloc(sizeof(int)); if (memoireAllouee == NULL) // Si l'allocation a chou { exit(0); // On arrte immdiatement le programme } // On peut continuer le programme normalement sinon. return 0; }

Si le pointeur est diffrent de NULL, le programme peut continuer, sinon il faut a fficher un message d'erreur ou mme mettre fin au programme, parce qu'il ne pourra pas continuer correctement s'il n'y a plus de place en mmoire.

free : librer de la mmoire

Tout comme on utilisait la fonction fclose pour fermer un fichier dont on n'avai t plus besoin, on va utiliser la fonction free pour librer la mmoire quand on n'en a plus besoin.

Code : C 1 void free(void* pointeur);

La fonction free a juste besoin de l'adresse mmoire librer. On va donc lui envoyer notre pointeur, c'est--dire memoireAllouee dans notre exemple. Voici le schma complet et final, ressemblant s'y mprendre ce qu'on a vu dans le ch apitre sur les fichiers : Code : C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(int argc, char *argv[]) { int* memoireAllouee = NULL; memoireAllouee = malloc(sizeof(int)); if (memoireAllouee == NULL) // On vrifie si la mmoire a t alloue { exit(0); // Erreur : on arrte tout ! } // On peut utiliser ici la mmoire free(memoireAllouee); // On n'a plus besoin de la mmoire, on la libre return 0; }

Exemple concret d'utilisation On va faire quelque chose qu'on a appris faire il y a longtemps : on va demander l'ge de l'utilisateur et on va le lui afficher. La seule diffrence avec ce qu'on faisait avant, c'est qu'ici la variable va tre al loue manuellement (on dit aussi dynamiquement) au lieu d'automatiquement comme au paravant. Alors oui, du coup, le code est un peu plus compliqu. Mais faites l'eff ort de bien essayer de le comprendre, c'est important :

Code : C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int main(int argc, char *argv[]) { int* memoireAllouee = NULL; memoireAllouee = malloc(sizeof(int)); // Allocation de la mmoire if (memoireAllouee == NULL) { exit(0); } // Utilisation de la mmoire printf("Quel age avez-vous ? "); scanf("%d", memoireAllouee); printf("Vous avez %d ans\n", *memoireAllouee); free(memoireAllouee); // Libration de mmoire return 0; }

Code : Console Quel age avez-vous ? 31 Vous avez 31 ans

Attention : comme memoireAllouee est un pointeur, on ne l'utilise pas de la mme m anire qu'une vraie variable. Pour obtenir la valeur de la variable, il faut mettr e une toile devant : "*memoireAllouee" (regardez le printf). Tandis que pour indi quer l'adresse, on a juste besoin d'crire le nom du pointeur "memoireAllouee" (re gardez le scanf) Tout cela a t expliqu dans le chapitre sur les pointeurs. Toutefois, on met gnralemen t du temps s'y faire, et il est probable que vous confondiez encore. Si c'est vo tre cas, vous DEVEZ relire le chapitre sur les pointeurs, qui est fondamental. Revenons notre code. On y a allou dynamiquement une variable de type int.

Au final, ce qu'on a crit revient exactement au mme que d'utiliser la mthode "autom atique" qu'on connat bien maintenant : Code : C 1 2 3 4 5 6 7 8 9 10 11 int main(int argc, char *argv[]) { int maVariable = 0; // Allocation de la mmoire (automatique) // Utilisation de la mmoire printf("Quel age avez-vous ? "); scanf("%d", &maVariable); printf("Vous avez %d ans\n", maVariable); return 0; } // Libration de la mmoire (automatique la fin de la fonction)

Code : Console Quel age avez-vous ? 31 Vous avez 31 ans

En rsum : il y a 2 faons de crer une variable, c'est--dire d'allouer de la mmoire. So t on le fait : Automatiquement : c'est la mthode que vous connaissez et qu'on a utilise jusqu'ici . Manuellement (= dynamiquement) : c'est la mthode que je vous enseigne dans ce cha pitre.

Je trouve la mthode dynamique complique et inutile ! Un peu plus complique... certes. Mais inutile, non ! On est parfois oblig d'allouer manuellement de la mmoire, comm e on va le voir maintenant -------------------------------------------------------------------------------Allocation dynamique d'un tableau Pour le moment, on s'est servis de l'allocation dynamique uniquement pour crer un e petite variable. Or en gnral, on ne se sert pas de l'allocation dynamique pour a On utilise la mthode automatique qui est plus simple.

Quand a-t-on besoin de l'allocation dynamique me direz-vous ? Le plus souvent, on se sert de l'allocation dynamique pour crer un tableau dont o n ne connat pas la taille avant l'excution du programme. Imaginons par exemple un programme qui stocke l'ge de tous les amis de l'utilisat eur dans un tableau. Vous pourriez crer un tableau de int pour stocker les ges, co mme ceci : Code : C 1 int ageAmis[15];

Mais qui vous dit que l'utilisateur a 15 amis ? Peut-tre qu'il en a plus que a ! Lorsque vous rdigez le code source, vous ne connaissez pas la taille que vous dev ez donner votre tableau. Vous ne le saurez qu' l'excution, lorsque vous demanderez l'utilisateur combien il a d'amis. L'intrt de l'allocation dynamique est l : on va demander le nombre d'amis l'utilisa teur, puis on fera une allocation dynamique pour crer un tableau ayant exactement la taille ncessaire (ni trop petit, ni trop grand ). Si l'utilisateur a 15 amis , on crera un tableau de 15 int, s'il en a 28 on crera un tableau de 28 int etc. Comme je vous l'ai appris, il est interdit en C de crer un tableau en indiquant s a taille l'aide d'une variable : Code : C 1 int amis[nombreDAmis];

(Notez : ce code marche peut-tre sur certains compilateurs mais uniquement dans d es cas prcis, il est recommand de ne pas l'utiliser !) L'avantage de l'allocation dynamique, c'est qu'elle nous permet de crer un tablea u qui a exactement la taille de la variable nombreDAmis, et cela grce un code qui marchera partout ! On va demander au malloc de nous rserver nombreDAmis * sizeof(int) octets en mmoir e : Code : C 1 amis = malloc(nombreDAmis * sizeof(int));

Ce code permet de crer un tableau de type int qui a une taille correspondant exac tement au nombre de ses amis !

Voici ce que va faire le programme dans l'ordre : 1.On demande l'utilisateur combien il a d'amis 2.On cre un tableau de int faisant une taille gale son nombre d'amis (via malloc) 3.On demande l'ge de chacun de ses amis un un, qu'on stocke dans le tableau

4.On affiche l'ge des amis pour montrer qu'on a bien mmoris tout cela 5.A la fin, on n'a plus besoin du tableau contenant l'ge des amis : on le libre av ec la fonction free.

Code : C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 int main(int argc, char *argv[]) { int nombreDAmis = 0, i = 0; int* ageAmis = NULL; // Ce pointeur va servir de tableau aprs l'appel du mall oc // On demande le nombre d'amis l'utilisateur printf("Combien d'amis avez-vous ? "); scanf("%d", &nombreDAmis); if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un p eu sinon :p) { ageAmis = malloc(nombreDAmis * sizeof(int)); // On alloue de la mmoire po ur le tableau if (ageAmis == NULL) // On vrifie si l'allocation a march ou pas {

exit(0); // On arrte tout } // On demande l'ge des amis un un for (i = 0 ; i < nombreDAmis ; i++) { printf("Quel age a l'ami numero %d ? ", i + 1); scanf("%d", &ageAmis[i]); } // On affiche les ges stocks un un printf("\n\nVos amis ont les ages suivants :\n"); for (i = 0 ; i < nombreDAmis ; i++) { printf("%d ans\n", ageAmis[i]); } // On libre la mmoire alloue avec malloc, on n'en a plus besoin free(ageAmis); } return 0; }

Code : Console Combien d'amis avez-vous ? 5 Quel age a l'ami numero 1 ? 16 Quel age a l'ami numero 2 ? 18 Quel age a l'ami numero 3 ? 20 Quel age a l'ami numero 4 ? 26 Quel age a l'ami numero 5 ? 27

Vos amis ont les ages suivants : 16 ans 18 ans 20 ans 26 ans 27 ans Ce programme est tout fait inutile : il demande les ges et les affiche ensuite. J 'ai choisi de faire cela car c'est un exemple "simple" (enfin si vous avez compr is le malloc ).

Que je vous rassure, dans la suite du cours nous aurons l'occasion d'utiliser le malloc pour des choses plus intressantes que le stockage de l'ge de ses amis --------------------------------------------------------------------------------

-------------------------------------------------------------------------------Ce chapitre n'tait pas trs vident je le reconnais, et il a d tre encore moins rigolo pour ceux qui n'avaient pas encore bien assimil les pointeurs ! D'ailleurs je vou s avais prvenu au dbut du chapitre ce sujet Tout cela est encore une preuve qu'il n'y a rien faire pour combattre les pointe urs, on ne peut pas les viter quand on programme en C. Il faut donc apprendre les connatre et les comprendre si on veut vraiment se prtendre programmeur en C. Ca m et plus ou moins de temps selon les gens, mais si on est motiv on finit toujours par y arriver Ce chapitre marque la fin d'une re (enfin presque ). L'allocation dynamique tait une des choses les plus difficiles que j'avais vous expliquer. On a vu la plupar t de la thorie du langage C qu'il faut connatre. Maintenant ce qu'il vous manque c'est de la pratique. Je vais donc tout mettre e n oeuvre pour vous faire pratiquer partir de cet instant. Justement, le chapitre suivant sera un TP. Prenez-le au srieux et prenez le temps qu'il faut pour l'assimiler. Il va vous demander de faire des efforts car c'est de la pratique pure de tout ce qu'on a appris jusqu'ici (et la pratique, vous l e savez bien maintenant, a n'a rien voir avec la thorie )

You might also like