Skip to content
Snippets Groups Projects
Verified Commit dba8a816 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

maj allocation dyn

parent 7d4c75b5
No related branches found
No related tags found
No related merge requests found
...@@ -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/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ë. - 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" ...@@ -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}. - 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/9) # Allocation dynamique de mémoire (2/8)
- On peut allouer et initialiser une `fraction_t`{.C}: - On peut allouer et initialiser une `fraction_t`{.C}:
...@@ -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/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}. - 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" ...@@ -44,7 +44,7 @@ date: "2022-11-22"
- 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/9) # Allocation dynamique de mémoire (4/8)
## 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/9) # Allocation dynamique de mémoire (5/8)
## Arithmétique de pointeurs ## Arithmétique de pointeurs
...@@ -83,25 +83,7 @@ $$ ...@@ -83,25 +83,7 @@ $$
\mathcal{O}(1). \mathcal{O}(1).
$$ $$
# Allocation dynamique de mémoire (6/9) # Allocation dynamique de mémoire (7/8)
## 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)
## Pointeur de pointeur ## Pointeur de pointeur
...@@ -114,13 +96,13 @@ p[50] = -1; // ça fait quoi? ...@@ -114,13 +96,13 @@ p[50] = -1; // ça fait quoi?
``` ```
- Chaque `*`{.C} ou `&`{.C} rajoute une indirection. - Chaque `*`{.C} ou `&`{.C} rajoute une indirection.
# Allocation dynamique de mémoire (8/9) # Allocation dynamique de mémoire (7/8)
## 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 (9/9) # Allocation dynamique de mémoire (8/8)
- Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs: - Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs:
...@@ -156,3 +138,84 @@ gcc -o main main.c -g -fsanitize=address -fsanitize=leak ...@@ -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. **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];
```
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