diff --git a/slides/allocation_dynamique.md b/slides/allocation_dynamique.md index 4c732143395a168a1d3eb9a07da9212c1fea20df..ccf0102f98875b43aac2cc5583cf9df1250a07a7 100644 --- a/slides/allocation_dynamique.md +++ b/slides/allocation_dynamique.md @@ -116,6 +116,58 @@ $$ - Ceci est une matrice (un tableau de tableau). +# Tableau dynamique en argument d'une fonction + +## Implémenter la fonction ci-dessous + +```C +int32_t *p = malloc(50 * sizeof(*p)); +initialize_to(p, 50, -1); // initialise un tableau à -1 +free(p); // ne pas oublier +``` + +. . . + +```C +void initialize_to(int32_t *p, size_t size, int32_t val) { + for (size_t i = 0; i < size; ++i) { + p[i] = val; + } +} +``` + + +# Tableau dynamique retourné d'une fonction + +## Implémenter la fonction ci-dessous + +```C +// alloue un tableau de taille 50 et l'initilise à -1 +int32_t *p = initialize_to(p, 50, -1); +free(p); // ne pas oublier +``` + +. . . + +```C +uint32_t initialize_to(int32_t *p, size_t size, int32_t val) { + int32_t *p = malloc(size * sizeof(*p)); + for (size_t i = 0; i < size; ++i) { + p[i] = val; + } + return p; +} +``` + +## Pourquoi on peut retourner un tableau dynamique et pas un statique? + +. . . + +* Le tableau est alloué sur le **tas** et non sur la **pile**. +* La mémoire est gérée manuellement sur le tas, automatiquement sur la pile. + + + # Les *sanitizers* Problèmes mémoire courants: @@ -130,7 +182,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): +Ici on utilise les sanitizers (modification de la ligne de compilation, modifiez les *Makefile*): ```bash gcc -o main main.c -g -fsanitize=address -fsanitize=leak