Langage C avancé Allocation dynamique de mémoire

Documents pareils
Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Chapitre 1 : La gestion dynamique de la mémoire

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Le prototype de la fonction main()

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Le langage C. Séance n 4

Algorithmique et Programmation, IMA

Compression de Données - Algorithme de Huffman Document de Conception

Les structures. Chapitre 3

Bases de programmation. Cours 5. Structurer les données

Introduction au langage C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation système I Les entrées/sorties

Le système de gestion des fichiers, les entrées/sorties.

Conventions d écriture et outils de mise au point


Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Programmation impérative

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

GESTION DES FICHIERS C/UNIX

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Cours Programmation Système

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Java Licence Professionnelle CISII,

Gestion de la mémoire

Programmation système de commandes en C

Les structures de données. Rajae El Ouazzani

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours de Programmation Impérative: Zones de mémoires et pointeurs

3IS - Système d'exploitation linux - Programmation système

Architecture des ordinateurs

Chap III : Les tableaux

Programmation C. J.-F. Lalande. 15 novembre 2012

Les arbres binaires de recherche

Cours Langage C/C++ Programmation modulaire

Outils pour la pratique

Claude Delannoy. 3 e édition C++

Programmation en langage C

Arguments d un programme

Les chaînes de caractères

Programmation système en C/C++

INITIATION A LA PROGRAMMATION

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Architecture des ordinateurs

Cours 6 : Tubes anonymes et nommés

Cours d initiation à la programmation en C++ Johann Cuenin

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Langages et Concepts de Programmation Introduction à la programmation en langage C

PROJET ALGORITHMIQUE ET PROGRAMMATION II

I. Introduction aux fonctions : les fonctions standards

Pensez à vous inscrire... si ce n est pas encore fait

INF 104 (SELC) Introduction au langage C

Package Java.util Classe générique

Premiers Pas en Programmation Objet : les Classes et les Objets

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Le langage C. Introduction, guide de reference

Manuel d'installation

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Derrière toi Une machine virtuelle!

Cours d Algorithmique et de Langage C v 3.0

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

OS Réseaux et Programmation Système - C5

UE Programmation Impérative Licence 2ème Année

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Cours de C. Allocation dynamique. Sébastien Paumier

Travaux Dirigés n 1 : chaînes de caractères

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

UE C avancé cours 1: introduction et révisions

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

V- Manipulations de nombres en binaire

Table des matières. Chapitre 4 : Variables pointeurs

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Langage Éric Guérin 5 octobre 2010

SUPPORT DE COURS. Langage C

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Algorithmique, Structures de données et langage C

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Introduction à l algorithmique et à la programmation M1102 CM n 3

Programmation Orientée Objet Java

Environnements de développement (intégrés)

Cours de programmation avancée. Le langage C. Université du Luxembourg

as Architecture des Systèmes d Information

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Introduction au calcul parallèle avec OpenCL

Transcription:

Langage C avancé Allocation dynamique de mémoire Samuel KOKH Maison de la Simulation - CEA Saclay samuel.kokh@cea.fr MACS 1 (2010-2011) Institut Galilée S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 1 / 19

Insuffisances de la gestion mémoire du stack en C (iso 89) Problème à résoudre On considère des vecteurs de double de taille fixe VECTSIZE. Ecrire une fonction SumVect qui réalise la somme de deux vecteurs et retourne le résultat.

Proposition de réponse # define VECTSIZE 5 # define VECTNULL {O,O,O,O,O} double * SumVect ( double *U, double *V){ double W[ VECTSIZE ]= VECTNULL ; int i = 0; } for (i = 0; i < VECTSIZE ; i ++){ W[i] = U[i] + V[i]; } return W;

Ca ne fonctionne pas! La gestion automatique de la mémoire de la pile (stack) ne permet pas de créer un espace de stockage d information au sein d une fonction et de transmettre son adresse d une fonction vers une autre de manière pérenne.

Autre problème à résoudre (en ANSI C ISO 89) On considère des vecteurs de double de taille fixe mais non-déterminée a priori Ecrire une fonctiononesvect qui crée un vecteur rempli de 1 de taille size où. size est le paramètre de la fonction OnesVect

Que faire? On a besoin d accéder à de la mémoire hors de la pile (stack). Allocation de mémoire dans le «tas» (Heap) Grâce à des commandes spécifiques, on peut allouer de la mémoire dans un autre espace mémoire appelé «tas» (Heap), hors de la pile. S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 6 / 19

Accéder au tas Stack main() fct_a() Heap L accès est totalement manuel : allocation : «à la main» désallocation : «à la main» fct_b() fct_c() Jeu de fonctions associées malloc() calloc() realloc() free() S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 7 / 19

Allocation de mémoire avec malloc() # include <stdlib.h> void * malloc ( size_t size ); Appel de la fonction malloc alloue un bloc memoire d une taille size octets dans le tas (heap) retourne l adresse du début de ce bloc mémoire grâce à une valeur de type (void ) en cas d échec de son appel, malloc retourne la valeur d adresse NULL Deux ingrédient nécessaire à l utilisation de malloc() pointeur générique (void*) spécification de taille mémoire en octets S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 8 / 19

Décrire des tailles d objets en mémoire : opérateur sizeof() Utilisation de sizeof() avec les types sizeof(atype_t) : retourne la taille en octets de atype_t sizeof(int) : retourne la taille en octets d un int sizeof(double*) : retourne la taille en octets d un pointeur vers double sizeof(struct mystruct_t) : retourne la taille en octets d un struct mystruct_t S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 9 / 19

Utilisation de sizeof() avec des variables int i; double * dptr ; char ch; sizeof (i); // valeur = taille d un int sizeof (&i); // valeur = taille d un ptr vers int sizeof ( dptr ); // valeur = taille d un ptr vers double sizeof (* dptr ); // valeur = taille d un double sizeof (ch ); // valeur = 1 ( octet ) S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 10 / 19

Utilisation de sizeof() avec des variables long array [10]; struct MyStruct_ t * var ; sizeof ( array [10]); // valeur = 10*( taille d un long ) sizeof ( var ); // valeur = taille d un // ptr vers un ( struct MyStruct_ t ) sizeof (* var ); // valeur = taille // d un ( struct MyStruct_t ) S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 11 / 19

Libération de mémoire avec free() # include <stdlib.h> void free ( void * ptr ); Appel de la fonction free() free() libère l espace mémoire du Heap vers lequel pointe ptr. après appel de free(), cet espace est de nouveau mobilisable dans le Heap par appel à une fonction de type malloc(), calloc() ou realloc(). S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 12 / 19

Mémoire dynamique : exemple simple De manière générale # include < stdlib.h> # include < stdio.h> Type_t * ptr = NULL ;... ptr = malloc ( sizeof ( Type_t )); // allocation /* test du resultat de l allocation */ if ( NULL == ptr ){ printf (" problem!\n"); exit ( EXIT_FAILURE ); }... fct (* ptr ); // cette fonction prend un parametre // Type_ t en argument... free ( ptr ); // liberation de la memoire pointee par ptr ptr = NULL ; // mesure de securite

Mémoire dynamique : exemple simple Un exemple avec des entiers # include < stdlib.h> # include < stdio.h> int * ptr = NULL ;... /* formulation condensee : allocation + test du resultat */ if ( NULL ==( ptr = malloc ( sizeof ( int )) ) ){ printf (" problem!\n"); exit ( EXIT_FAILURE ); }... * ptr =14; fct (* ptr ); // cette fonction prend un int en argument... free ( ptr ); // liberation de la memoire pointee par ptr ptr = NULL ; // mesure de securite

Allocation de mémoire avec calloc() # include <stdlib.h> void * calloc ( size_ t nmemb, size_ t size ); Appel de la fonction calloc() alloue un bloc memoire d une taille permettant de stocker nmemb éléments de taille size octets dans le tas nmemb size octets met à zéro tous les bits du bloc mémoire alloué retourne l adresse du début de ce bloc mémoire grâce à une valeur de type (void*) en cas d échec de son appel, malloc() retourne la valeur d adresse NULL Spécificité de calloc C est la mise à zéro des bits : calloc = Clear ALLOC S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 15 / 19

A propos de l appel de malloc() Ne pas oublier # include < stdlib.h> Dans les fichiers où sont effectués les appels à malloc(), calloc(), realloc(), free(). Sinon une compilation avec par exemple le flag -Wall retourne des warnings main. c :7: warning : implicit declaration of function malloc main. c :7: warning : incompatible implicit declaration of built - in function malloc main. c :10: warning : implicit declaration of function free S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 16 / 19

A propos de l appel de malloc Exemples d appel int * ptr = NULL ;... ptr = malloc ( sizeof ( int )); // ok ptr = malloc ( sizeof (* ptr )); // ok ptr = malloc ( sizeof ( 8)); // DANGER : passe // a la compilation! S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 17 / 19

A propos de l appel de malloc Exemples d appel # define NB_ ELTS 12 int *A= NULL ; /* versions avec malloc */ A = malloc (12* sizeof ( int )); // bof A = malloc ( NB_ELTS * sizeof ( int )); // ok A = malloc (12* sizeof (*A)); // bof A = malloc ( NB_ELTS * sizeof (*A)); // ok /* versions avec calloc */ A = calloc (12, sizeof ( int )); // bof A = calloc ( NB_ELTS, sizeof ( int )); // ok A = calloc (12, sizeof (*A)); // bof A = calloc ( NB_ELTS, sizeof (*A)); // ok S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2010-2011 18 / 19

Retour sur la fonction SumVect() # include < stdio.h> # define VECTSIZE 5 double * SumVect ( double *U, double *V){ double * W = NULL ; int i = 0; W= malloc ( VECTSIZE * sizeof (*W)); if( NULL ==W){ // gestion de l erreur... } for (i = 0; i < VECTSIZE ; i ++){ W[i] = U[i] + V[i] ; } } return W;