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

Corrected few typos

parent 8f928aa6
Branches
Tags
No related merge requests found
Pipeline #20701 passed
...@@ -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.
Please register or to comment