diff --git a/slides/allocation_dynamique.md b/slides/allocation_dynamique.md index f9b7438e2c7f4a5d2fa427610ce974ad549487af..4c732143395a168a1d3eb9a07da9212c1fea20df 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/9) +# Allocation dynamique de mémoire (1/8) - La fonction `malloc`{.C} permet d'allouer dynamiquement (pendant l'exécution du programme) une zone de mémoire contiguë. @@ -15,7 +15,7 @@ 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/9) +# Allocation dynamique de mémoire (2/8) - On peut allouer et initialiser une `fraction_t`{.C}: @@ -30,7 +30,7 @@ date: "2022-11-22" {width=100%} -# Allocation dynamique de mémoire (3/9) +# Allocation dynamique de mémoire (3/8) - La fonction `free()`{.C} permet de libérer une zone préalablement allouée avec `malloc()`{.C}. @@ -44,7 +44,7 @@ date: "2022-11-22" - Pour éviter les mauvaises surprises mettre `ptr`{.C} à `NULL`{.C} après libération. -# Allocation dynamique de mémoire (4/9) +# Allocation dynamique de mémoire (4/8) ## 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/9) +# Allocation dynamique de mémoire (5/8) ## Arithmétique de pointeurs @@ -83,25 +83,7 @@ $$ \mathcal{O}(1). $$ -# Allocation dynamique de mémoire (6/9) - -## Questions - -```C -int *p = malloc(50 * sizeof(int)); -for (int i = 0; i < 50; ++i) - p[i] = 0; // ça fait quoi? -sizeof(p); // ça vaut quoi? -sizeof(*p); // ça vaut quoi? -p[10] = -1; // ça fait quoi? -(p + 20) = -1; // ça fait quoi? -*(p + 20) = -1; // ça fait quoi? -p[-1] = -1; // ça fait quoi? -p[50] = -1; // ça fait quoi? -7[p] = 12; // ça fait quoi? -``` - -# Allocation dynamique de mémoire (7/9) +# Allocation dynamique de mémoire (7/8) ## Pointeur de pointeur @@ -114,13 +96,13 @@ p[50] = -1; // ça fait quoi? ``` - Chaque `*`{.C} ou `&`{.C} rajoute une indirection. -# Allocation dynamique de mémoire (8/9) +# Allocation dynamique de mémoire (7/8) ## Pointeur de pointeur {height=100%} -# Allocation dynamique de mémoire (9/9) +# Allocation dynamique de mémoire (8/8) - Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs: @@ -156,3 +138,84 @@ gcc -o main main.c -g -fsanitize=address -fsanitize=leak **Attention:** Il faut également faire l'édition des liens avec les sanitizers. +# Questions + +## Que fait le code suivant? + +```C +int *p = malloc(50 * sizeof(int)); +p[10] = 1; +``` + +. . . + +* On alloue de la place pour 50 entiers, +* On initialise le 11e élément du tableau à 1, +* Les autres éléments sont non-initialisés. + +# Questions + +## Que fait le code suivant? + +```C +float *p = malloc(50); +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. + +# Questions + +## Que fait le code suivant? + +```C +float *p = malloc(50); +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. + +# Questions + +* Soit le code suivant + +```C +int *p = malloc(50 * sizeof(int)); +for (int i = 0; i < 50; ++i) { + p[i] = 0; +} +``` + +* Le réécrire en utilisant uniquement l'arithmétique de pointeurs. + +. . . + +```C +int *p = malloc(50 * sizeof(int)); +for (int i = 0; i < 50; ++i) { + *(p+i) = 0; +} +``` + +# Questions + +## Que valent les expressions suivantes? + +```C +in32_t *p = malloc(50 * sizeof(int32_t)); +sizeof(p); +sizeof(*p); +(p + 20); +*(p + 20); +p[-1]; +p[50]; +7[p]; +```