đ 1. DĂ©finitions & Cadre d'Ă©tude
đ 1. DĂ©finitions & Cadre dâĂ©tude
Section titled âđ 1. DĂ©finitions & Cadre dâĂ©tudeâEn langage C, la mĂ©moire vive est modĂ©lisĂ©e comme un tableau linĂ©aire gĂ©ant dâoctets adressables. Chaque emplacement mĂ©moire possĂšde une adresse unique, qui est un entier non signĂ© reprĂ©sentant sa position.
ModĂšle de la mĂ©moire dâun processus
Section titled âModĂšle de la mĂ©moire dâun processusâLa mĂ©moire allouĂ©e Ă un programme en exĂ©cution est traditionnellement dĂ©coupĂ©e en plusieurs zones distinctes :
- La zone Texte (Code) : Contient le code machine exécutable du programme.
- La zone des données globales et statiques : Contient les variables globales et les variables locales dotées du qualificatif
static. - La pile (Stack) : Zone gérée automatiquement par le systÚme (LIFO : Last In, First Out). Elle stocke les variables locales des fonctions et les cadres de pile (stack frames) lors des appels de fonctions.
- Le tas (Heap) : Zone de mĂ©moire dite âdynamiqueâ, gĂ©rĂ©e explicitement par le programmeur via des fonctions dâallocation et de libĂ©ration.
Le concept de pointeur
Section titled âLe concept de pointeurâUn pointeur est une variable dont la valeur est lâadresse mĂ©moire dâune autre variable.
- Déclaration :
type *nom_variable;(ex:int *p;). - LâopĂ©rateur dâadressage
&permet dâobtenir lâadresse dâune variable :p = &x;. - LâopĂ©rateur de dĂ©rĂ©fĂ©rencement
*permet dâaccĂ©der ou de modifier la valeur stockĂ©e Ă lâadresse pointĂ©e :*p = 5;.
đ 2. ThĂ©orĂšmes fondamentaux & DĂ©monstrations clĂ©s
Section titled âđ 2. ThĂ©orĂšmes fondamentaux & DĂ©monstrations clĂ©sâThĂ©orĂšme dâĂ©quivalence entre tableaux et pointeurs
Section titled âThĂ©orĂšme dâĂ©quivalence entre tableaux et pointeursâEn C, le nom dâun tableau non qualifiĂ© est converti (decay) lors de son utilisation en un pointeur constant vers son premier Ă©lĂ©ment.
Soit T un tableau de type type et dâindice . LâaccĂšs par notation tableau T[i] est syntaxiquement et sĂ©mantiquement rigoureusement Ă©quivalent Ă lâarithmĂ©tique des pointeurs :
Démonstration / Justification formelle :
Section titled âDĂ©monstration / Justification formelle :âLâadresse de lâĂ©lĂ©ment dâindice est calculĂ©e par le compilateur en tenant compte de la taille en octets du type sous-jacent . Si est lâadresse de base du tableau (soit ), lâadresse de est :
Le dĂ©rĂ©fĂ©rencement de cette adresse par lâopĂ©rateur * donne directement la valeur stockĂ©e Ă cet emplacement, prouvant lâidentitĂ©.
đĄ 3. MĂ©thodes de calcul & Algorithmes
Section titled âđĄ 3. MĂ©thodes de calcul & AlgorithmesâAllocation dynamique sur le tas (malloc, calloc, realloc, free)
Section titled âAllocation dynamique sur le tas (malloc, calloc, realloc, free)âLâutilisation du tas est indispensable lorsque la taille des donnĂ©es nâest pas connue Ă la compilation ou doit persister au-delĂ de la portĂ©e dâune fonction.
1. Allocation brute avec malloc
Section titled â1. Allocation brute avec mallocâint *ptr = malloc(n * sizeof(int));if (ptr == NULL) { // Gestion de l'erreur d'allocation (memoire saturee) exit(EXIT_FAILURE);}2. Allocation et initialisation Ă zĂ©ro avec calloc
Section titled â2. Allocation et initialisation Ă zĂ©ro avec callocâint *ptr = calloc(n, sizeof(int)); // Met tous les octets a 03. LibĂ©ration impĂ©rative avec free
Section titled â3. LibĂ©ration impĂ©rative avec freeâToute zone allouĂ©e dynamiquement doit ĂȘtre libĂ©rĂ©e exactement une fois pour Ă©viter les fuites de mĂ©moire (memory leaks) :
free(ptr);ptr = NULL; // Bonne pratique pour eviter les "pointeurs pendouillants"â ïž 4. PiĂšges classiques aux Concours
Section titled ââ ïž 4. PiĂšges classiques aux Concoursâ-
Le pointeur pendouillant (dangling pointer) : Accéder à une zone mémoire aprÚs sa libération par
free, ou retourner lâadresse dâune variable locale (allouĂ©e sur la pile) dâune fonction qui sâest terminĂ©e.int* f() {int x = 5;return &x; // ERREUR GRAVE : x est detruit a la sortie de la fonction} -
La fuite mémoire (memory leak) : Oublier de libérer un bloc mémoire alloué par
malloc/calloc, ou perdre le dernier pointeur y menant en écrasant sa valeur. -
Le dĂ©passement de tampon (buffer overflow) : Ăcrire ou lire en dehors des limites dâun tableau allouĂ© (notamment par erreur sur les indices Ă ). En MP2I, ce type dâerreur entraĂźne un comportement indĂ©fini (undefined behavior) et peut corrompre la pile dâexĂ©cution.
-
Confusion entre taille logique et taille physique (
sizeof) : LâopĂ©rateursizeofappliquĂ© Ă un pointeur passĂ© en paramĂštre dâune fonction renvoie la taille du pointeur en mĂ©moire (ex: octets sur une architecture bits), et en aucun cas la taille du tableau pointĂ©.