Skip to content
Snippets Groups Projects
Commit 7e8c1280 authored by paul.albuquer's avatar paul.albuquer
Browse files

Corrected few typos

parent 8f928aa6
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,7 @@ title: "Allocation dynamique de mémoire" ...@@ -3,7 +3,7 @@ title: "Allocation dynamique de mémoire"
date: "2022-11-22" date: "2022-11-22"
--- ---
# Allocation dynamique de mémoire (1/8) # Allocation dynamique de mémoire (1/7)
- La fonction `malloc`{.C} permet d'allouer dynamiquement (pendant l'exécution du programme) une zone de mémoire contiguë. - La fonction `malloc`{.C} permet d'allouer dynamiquement (pendant l'exécution du programme) une zone de mémoire contiguë.
...@@ -15,14 +15,14 @@ date: "2022-11-22" ...@@ -15,14 +15,14 @@ date: "2022-11-22"
- Retourne un pointeur sur la zone mémoire ou `NULL`{.C} en cas d'échec: **toujours vérifier** que la valeur retournée est `!= NULL`{.C}. - Retourne un pointeur sur la zone mémoire ou `NULL`{.C} en cas d'échec: **toujours vérifier** que la valeur retournée est `!= NULL`{.C}.
- Le *type* du retour est `void *`{.C} (un pointeur de type quelconque). - Le *type* du retour est `void *`{.C} (un pointeur de type quelconque).
# Allocation dynamique de mémoire (2/8) # Allocation dynamique de mémoire (2/7)
- On peut allouer et initialiser une `fraction_t`{.C}: - On peut allouer et initialiser une `fraction_t`{.C}:
```C ```C
fraction_t *num = malloc(sizeof(fraction_t)); fraction_t *frac = malloc(sizeof(fraction_t));
num->num = 1; frac->num = 1;
num->denom = -1; frac->denom = -1;
``` ```
- La zone mémoire **n'est pas** initialisée. - La zone mémoire **n'est pas** initialisée.
- Désallouer la mémoire explicitement $\Rightarrow$ **fuites mémoires**. - Désallouer la mémoire explicitement $\Rightarrow$ **fuites mémoires**.
...@@ -30,7 +30,7 @@ date: "2022-11-22" ...@@ -30,7 +30,7 @@ date: "2022-11-22"
![La représentation mémoire de `fraction_t` et fuites.](figs/pointer_struct_ok.svg){width=100%} ![La représentation mémoire de `fraction_t` et fuites.](figs/pointer_struct_ok.svg){width=100%}
# Allocation dynamique de mémoire (3/8) # Allocation dynamique de mémoire (3/7)
- La fonction `free()`{.C} permet de libérer une zone préalablement allouée avec `malloc()`{.C}. - La fonction `free()`{.C} permet de libérer une zone préalablement allouée avec `malloc()`{.C}.
...@@ -38,13 +38,13 @@ date: "2022-11-22" ...@@ -38,13 +38,13 @@ date: "2022-11-22"
#include <stdlib.h> #include <stdlib.h>
void free(void *ptr); void free(void *ptr);
``` ```
- Pour chaque `malloc()`{.C} doit correspondre exactement un `free()`{.C}. - A chaque `malloc()`{.C} doit correspondre exactement un `free()`{.C}.
- Si la mémoire n'est pas libérée: **fuite mémoire** (l'ordinateur plante quand il y a plus de mémoire). - Si la mémoire n'est pas libérée: **fuite mémoire** (l'ordinateur plante quand il y a plus de mémoire).
- Si la mémoire est **libérée deux fois**: *seg. fault*. - Si la mémoire est **libérée deux fois**: *seg. fault*.
- Pour éviter les mauvaises surprises mettre `ptr`{.C} à `NULL`{.C} après - Pour éviter les mauvaises surprises mettre `ptr`{.C} à `NULL`{.C} après
libération. libération.
# Allocation dynamique de mémoire (4/8) # Allocation dynamique de mémoire (4/7)
## Tableaux dynamiques ## Tableaux dynamiques
...@@ -69,7 +69,7 @@ date: "2022-11-22" ...@@ -69,7 +69,7 @@ date: "2022-11-22"
p[0] == *p; // le pointeur est le premier élément p[0] == *p; // le pointeur est le premier élément
``` ```
# Allocation dynamique de mémoire (5/8) # Allocation dynamique de mémoire (5/7)
## Arithmétique de pointeurs ## Arithmétique de pointeurs
...@@ -83,7 +83,7 @@ $$ ...@@ -83,7 +83,7 @@ $$
\mathcal{O}(1). \mathcal{O}(1).
$$ $$
# Allocation dynamique de mémoire (7/8) # Allocation dynamique de mémoire (6/7)
## Pointeur de pointeur ## Pointeur de pointeur
...@@ -94,15 +94,17 @@ $$ ...@@ -94,15 +94,17 @@ $$
int *b = &a; int *b = &a;
int **c = &b; int **c = &b;
``` ```
- En effet, un pointeur est aussi une variable (une variable qui contient une adresse mémoire).
- Chaque `*`{.C} ou `&`{.C} rajoute une indirection. - Chaque `*`{.C} ou `&`{.C} rajoute une indirection.
# Allocation dynamique de mémoire (7/8) # Allocation dynamique de mémoire (6/7)
## Pointeur de pointeur ## Pointeur de pointeur
![Les références de pointeurs.](figs/double_pointeur.svg){height=100%} ![Les références de pointeurs.](figs/double_pointeur.svg){height=100%}
# Allocation dynamique de mémoire (8/8) # Allocation dynamique de mémoire (7/7)
- Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs: - Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs:
...@@ -114,7 +116,7 @@ $$ ...@@ -114,7 +116,7 @@ $$
int a = p[5][8]; // on indexe dans chaque dimension int a = p[5][8]; // on indexe dans chaque dimension
``` ```
- Ceci est une matrice (un tableau de tableau). - Ceci est une matrice (un tableau de tableaux).
# Tableau dynamique en argument d'une fonction # Tableau dynamique en argument d'une fonction
...@@ -182,7 +184,7 @@ Outils pour leur détection: ...@@ -182,7 +184,7 @@ Outils pour leur détection:
* Valgrind (outil externe). * Valgrind (outil externe).
* Sanitizers (ajouts de marqueurs à la compilation). * Sanitizers (ajouts de marqueurs à la compilation).
Ici on utilise les sanitizers (modification de la ligne de compilation, modifiez les *Makefile*): Ici on utilise les sanitizers (modification de la ligne de compilation, modifiez donc vos *Makefile*):
```bash ```bash
gcc -o main main.c -g -fsanitize=address -fsanitize=leak gcc -o main main.c -g -fsanitize=address -fsanitize=leak
...@@ -201,8 +203,8 @@ p[10] = 1; ...@@ -201,8 +203,8 @@ p[10] = 1;
. . . . . .
* On alloue de la place pour 50 entiers, * On alloue de la place pour 50 entiers.
* On initialise le 11e élément du tableau à 1, * On initialise le 11ème élément du tableau à 1.
* Les autres éléments sont non-initialisés. * Les autres éléments sont non-initialisés.
# Questions # Questions
...@@ -216,9 +218,9 @@ p[20] = 1.3; ...@@ -216,9 +218,9 @@ p[20] = 1.3;
. . . . . .
* On déclare un pointeur de floats de taille 50 octets, * On déclare un pointeur de floats de taille 50 octets.
* Mais il ne peut contenir que `50 / 4` floats (un float est composé de 32bits), * Mais il ne peut contenir que `50 / 4` floats (un float est composé de 32 bits).
* On dépasse la capacité de la mémoire alloué: comportement indéfini. * On dépasse la capacité de la mémoire allouée: comportement indéfini.
# Questions # Questions
...@@ -231,8 +233,8 @@ p[20] = 1.3; ...@@ -231,8 +233,8 @@ p[20] = 1.3;
. . . . . .
* On déclare un pointeur de floats de taille 50 octets, * On déclare un pointeur de floats de taille 50 octets.
* Mais il ne peut contenir que `50 / 4` floats (un float est composé de 32bits), * Mais il ne peut contenir que `50 / 4` floats (un float est composé de 32 bits).
* On dépasse la capacité de la mémoire alloué: comportement indéfini. * On dépasse la capacité de la mémoire alloué: comportement indéfini.
# Questions # Questions
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment