• Aucun résultat trouvé

Langage C Allocation dynamique de mémoire François Cuvelier

N/A
N/A
Protected

Academic year: 2022

Partager "Langage C Allocation dynamique de mémoire François Cuvelier"

Copied!
14
0
0

Texte intégral

(1)

Langage C

Allocation dynamique de mémoire

François Cuvelier

Institut Galilée Université Paris XIII.

19 octobre 2019

(2)

Plan

1

Introduction

2

Fonction malloc()

3

Fonction calloc()

4

Fonction free()

(3)

Introduction

L’allocation dynamique de mémoire permet en cours d’éxécution d’un

programme de réserver un espace mémoire dont la taille n’est pas

nécessairement connue lors de la compilation.

(4)

Introduction

L’allocation dynamique de mémoire permet en cours d’éxécution d’un programme de réserver un espace mémoire dont la taille n’est pas nécessairement connue lors de la compilation.

L’allocation dynamique est réalisée par les fonctions malloc() et calloc ().

(5)

Plan

1

Introduction

2

Fonction malloc()

3

Fonction calloc()

4

Fonction free()

(6)

Fonction malloc()

Prototype

void * malloc ( size_t t );

Description

permet de réserver (si possible) un bloc de taille t (en bytes) et renvoie un pointeur vers l’adresse du bloc alloué s’il y a suffisament de mémoire disponible

la valeur NULL en cas d’erreur.

(7)

Fonction malloc() : Exemple 1

Code

1

i n t ∗ p i , n ;

2

p r i n t f ( "n=" ) ; s c a n f ( "%d" ,&n ) ;

3

p i= ( i n t ∗ ) m a l l o c ( n ∗ s i z e o f ( i n t ) ) ;

Description

La fonction malloc alloue (si possible) un bloc de n int et retourne l’adresse (non typée, void ∗) du bloc.

On effectue alors une conversion de type : void ∗ vers int ∗.

Attention, aucun test si la fonction retourne la valeur NULL.

(8)

Fonction malloc() : Exemple 2

Code

1

p i= ( i n t ∗ ) m a l l o c ( n ∗ s i z e o f ( i n t ) ) ;

2

i f ( p i == NULL ) {

3

f p r i n t f ( s t d e r r ,

4

" Allocation ␣ impossible ␣:␣ fichier ␣%s ,␣ ligne ␣%d\n" ,

5

__FILE__ , __LINE__−2);

6

e x i t ( EXIT_FAILURE ) ;

7

}

Description

En cas d’erreur d’allocation, le programme affiche un message d’erreur et se termine !

On utilise ici des constantes du préprocesseur : __FILE__ : affiche le nom du fichier source.

__LINE__ : affiche le numéro de la ligne atteinte

(9)

Plan

1

Introduction

2

Fonction malloc()

3

Fonction calloc()

4

Fonction free()

(10)

Fonction calloc ()

Prototype

void * calloc(size_t n, size_t t);

Description

permet de réserver (si possible) n blocs de taille t (en bytes) et renvoie un pointeur vers l’adresse du bloc alloué s’il y a suffisament de mémoire disponible

la valeur NULL en cas d’erreur.

les blocs alloués sont tous mis à 0 (contrairement à la fonction

malloc() où la mémoire est non initialisée : donc aléatoire)

(11)

Fonction calloc () : Exemple 1

Code

1

i n t ∗ p i , n ;

2

p r i n t f ( "n=" ) ; s c a n f ( "%d" ,&n ) ;

3

p i= ( i n t ∗ ) c a l l o c ( n , s i z e o f ( i n t ) ) ;

Description

La fonction calloc alloue (si possible) un bloc de n int et retourne l’adresse (non typée, void ∗) du bloc.

On effectue alors une conversion de type : void ∗ vers int ∗.

De plus, chaque bloc contient la valeur 0.

Attention, aucun test si la fonction retourne la valeur NULL.

(12)

Plan

1

Introduction

2

Fonction malloc()

3

Fonction calloc()

4

Fonction free()

(13)

Fonction free ()

Prototype

void free(void *);

Description

permet de libérer de la mémoire préalablement allouée par les fonctions malloc() ou calloc ().

En paramètre, on passe l’adresse du bloc mémoire à désallouer.

(14)

Fonction free () - Exemple

Code

1

#i n c l u d e < s t d l i b . h>

2

#i n c l u d e < s t d i o . h>

3

4

v o i d main ( ) {

5

i n t ∗ p i , n , i ;

6

p r i n t f ( "n=" ) ; s c a n f ( "%d" ,&n ) ;

7

p i= ( i n t ∗ ) m a l l o c ( n ∗ s i z e o f ( i n t ) ) ;

8

i f ( p i == NULL ) {

9

f p r i n t f ( s t d e r r ,

10

" Allocation ␣ impossible ␣:␣ fichier ␣%s ,␣ ligne ␣%d\n" ,

11

__FILE__ , __LINE__−4);

12

e x i t ( EXIT_FAILURE ) ;

13

}

14

f o r ( i =0; i <n ; i ++) p i [ i ]=2∗ i ;

15

f o r ( i =0; i <n ; i ++) p r i n t f ( " pi [% d ]=% d\n" , i , p i [ i ] ) ;

16

f r e e ( p i ) ;

17

}

Références

Documents relatifs

Nous avons également vu que dans le domaine de l’embarqué contraint, le code de l’application cible peut être exécutée directement en place dans la mémoire de stockage,

L'allocation dynamique de mémoire permet en cours d'éxécution d'un programme de réserver un espace mémoire dont la taille n'est pas nécessairement connue lors de la

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des

Adapter la fonction de création pour créer une liste linéaire chaînée dans l'ordre FIFO à partir de ce fichier binaire.. Exercice 2 : Supposons que les données

- Le pointeur « ptr » contient l’adresse mémoire d’une zone mémoire capable de contenir une variable de type « int ».. - La définition d’un pointeur n’alloue en

p tend à diminuer la longueur r de la normale nous aurons pour déterminer le mouvement du corps flottant , l’équation. dans laquelle les intégrales indiquées par la

qui nous met personnellement en jeu. Les données matérielles de l'expérience appellent toujours ce même coefficient d'intégration qui définit à la fois la

Pour libérer de la mémoire allouée dynamiquement en C++, on utilisera l’opérateur delete...