From 7e8c1280d497de38ac96999b51edab3919426e21 Mon Sep 17 00:00:00 2001 From: "paul.albuquer" <paul.albuquerque@hesge.ch> Date: Mon, 21 Nov 2022 19:54:40 +0100 Subject: [PATCH] Corrected few typos --- slides/allocation_dynamique.md | 44 ++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/slides/allocation_dynamique.md b/slides/allocation_dynamique.md index ccf651e..6f312ae 100644 --- a/slides/allocation_dynamique.md +++ b/slides/allocation_dynamique.md @@ -3,7 +3,7 @@ title: "Allocation dynamique de mémoire" 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ë. @@ -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}. - 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}: ```C - fraction_t *num = malloc(sizeof(fraction_t)); - num->num = 1; - num->denom = -1; + fraction_t *frac = malloc(sizeof(fraction_t)); + frac->num = 1; + frac->denom = -1; ``` - La zone mémoire **n'est pas** initialisée. - Désallouer la mémoire explicitement $\Rightarrow$ **fuites mémoires**. @@ -30,7 +30,7 @@ date: "2022-11-22" {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}. @@ -38,13 +38,13 @@ date: "2022-11-22" #include <stdlib.h> 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 est **libérée deux fois**: *seg. fault*. - Pour éviter les mauvaises surprises mettre `ptr`{.C} à `NULL`{.C} après libération. -# Allocation dynamique de mémoire (4/8) +# Allocation dynamique de mémoire (4/7) ## Tableaux dynamiques @@ -69,7 +69,7 @@ date: "2022-11-22" 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 @@ -83,7 +83,7 @@ $$ \mathcal{O}(1). $$ -# Allocation dynamique de mémoire (7/8) +# Allocation dynamique de mémoire (6/7) ## Pointeur de pointeur @@ -94,15 +94,17 @@ $$ int *b = &a; 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. -# Allocation dynamique de mémoire (7/8) +# Allocation dynamique de mémoire (6/7) ## Pointeur de pointeur {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: @@ -114,7 +116,7 @@ $$ 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 @@ -182,7 +184,7 @@ Outils pour leur détection: * Valgrind (outil externe). * 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 gcc -o main main.c -g -fsanitize=address -fsanitize=leak @@ -201,8 +203,8 @@ p[10] = 1; . . . -* On alloue de la place pour 50 entiers, -* On initialise le 11e élément du tableau à 1, +* On alloue de la place pour 50 entiers. +* On initialise le 11ème élément du tableau à 1. * Les autres éléments sont non-initialisés. # Questions @@ -216,9 +218,9 @@ p[20] = 1.3; . . . -* 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), -* On dépasse la capacité de la mémoire alloué: comportement indéfini. +* 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 32 bits). +* On dépasse la capacité de la mémoire allouée: comportement indéfini. # Questions @@ -231,8 +233,8 @@ p[20] = 1.3; . . . -* 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), +* 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 32 bits). * On dépasse la capacité de la mémoire alloué: comportement indéfini. # Questions -- GitLab