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"
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"
![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}.
......@@ -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
![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:
......@@ -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
......
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