3ième Classe (Mardi, 23 Septembre) CSI2572. O jourd'8: E Allocation de mémoire E Déallocation de mémoire E Tableaux (n dimensions) E Arithmetique des.

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Introduction Langage très répandu Noyau Linux VLC … Des avantages indéniables mais aussi des contraintes ! Ceci nest quun rapide tour.
Rappels C.
GEF 243B Programmation informatique appliquée
C.
Paramètres et pointeurs
Structures et unions types énumérés Qu'est-ce qu'une structure
Les pointeurs Manipulation d'adresses et de ce qui est contenu dans ces adresses Très important, fondamental même en C mauvaise réputation : 'dur à comprendre',
FLSI602 Génie Informatique et Réseaux
Principes de programmation (suite)
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que lon veut allouer. Le premier exemple: #include void main()
TRAITEMENT DE STRUCTURES
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT-2000: Structures de données
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Structures de données IFT-2000
Présentation Structures de Données et TDA
Points importants de la semaine Les allocations programmées de mémoire. Les enregistrements.
IFT 6800 Atelier en Technologies d’information
8PRO100 Éléments de programmation Les types composés.
Méthode et Outils pour la Programmation
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Tableaux Introduction aux tableaux à une dimension. Déclaration, stockage, initialisation et accès en lecture ou en écriture aux composantes d’un tableau.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
PHP 2° PARTIE : FONCTIONS ET FORMULAIRE
L’essentiel du langage C
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
Les pointeurs L'opérateur &.
Le langage C Rappel Pointeurs & Allocation de mémoire.
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
La notion de type revisitée en POO
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Programmation Système et Réseau
Introduction au langage C Fonctions et Procédures
ETNA – 1ème année Guillaume Belmas –
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
CSI 3525, Implémentation des sous-programmes, page 1 Implémentation des sous-programmes L’environnement dans les langages structurés en bloc La structure.
ISBN Chapitre 10 L'implémentation des sous- programmes.
8PRO100 Éléments de programmation Les pointeurs de caractères.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
8PRO107 Éléments de programmation Les adresses et les pointeurs.
1 Listes des méthodes de la classe string, et exemples.
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Organisation de la mémoire pour le langage minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Philippe Gandy – 10 novembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
1 ALGORITHMIQUE AVANCEE IUT Vélizy – RT2 FA Laurent Marsan.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Informatique 2A Langage C 3 ème séance.
Transcription de la présentation:

3ième Classe (Mardi, 23 Septembre) CSI2572

O jourd'8: E Allocation de mémoire E Déallocation de mémoire E Tableaux (n dimensions) E Arithmetique des pointeurs E Pointeurs sur fonctions

Allocation de mémoire: Dans C comme dans C++, il y à 3 manières d’allouer de l’espace mémoire: 3 Mémoire Statique: La mémoire est allouée par le linker au début du programme, et est libérée lorsque le programme à fini d'éxécuter. 3 Mémoire Automatique: La mémoire est automatiquement allouée, gérée et libérée pendant l'éxecution du programme. Les arguments des fonctions et les variables locales obtiennent de l'espace de cette manière 3 Mémoire Dynamique: La mémoire est requise explicitement par le programme(ur). Le programme(ur) gère et libère la memoire (en principe).

Où se trouve la variable? compile-time program-text i variables globales i variables static automatic stack i variables locales i parametres de fonctions i valeur de retour des fonctions run-time heap i malloc i calloc i realloc

Les espaces mémoire alloués de manière statiques ou automatiques ne sont généralement pas 1 problème pour le programmeur (qui n'a généralement pas besoin de s'en occuper). Il faut cependant en être conscient pour pouvoir optimiser ces programmes. int x; /* global */ int f(int n) { int x; /* local to f */ if (n > 3) { int x; /* local to if */... } { /* a local scope * "out of the blue" */ int x; } S T A T I Q U E Constantes Variables globales Variables déclarées: static A U T O M A T I Q U E Variables Locales Paramétres de fonctions Retours de fonctions

Allocation de mémoire dynamique: C L'allocation de mémoire dynamique a par contre tendance à être 1 peu + problématique pour le programmeur. C lui (ou L) qui l'alloue, qui la gère et qui n'oubli pas de la rendre au systeme quand il n'en a + besoin. Si la job est mal faite, attendez vous à des problèmes!!! C Le heap sert à l'allocation dynamique de blocs de mémoire de taille variable. C De nombreuses structures de données emploient tout naturellement l'allocation de mémoire dans le heap, comme par exemple les arbres et les listes. C Le seul risque est la fragmentation du heap, par allocation et libération successives. Il n'existe pas en C de mécanisme de "ramasse-miettes" (garbage collector).

int * x = (int*)malloc(sizeof(int)); int * a = (int*)calloc(10,sizeof(int)); *x = 3; a[2] = 5; free(a); a = 0; free(x); x = 0; Fonctions de gestion de mémoire (C) void* malloc(size_t size); void* calloc(size_t n, size_t size); void* realloc(void * ptr,size_t size); void free(void * ptr);

Demande d'allocation de mémoire ( malloc ) † malloc demande l'allocation d'un bloc de mémoire de size octets consécutifs dans la zone de mémoire du heap. † Syntaxe : #include void *malloc(size_t size); † Valeur retournée : Si l'allocation réussit, malloc retourne un pointeur sur le début du bloc alloué. Si la place disponible est insuffisante ou si size vaut 0, malloc retourne NULL. † Attention : Les fonctions d'allocation dynamique retournent des pointeurs sur des void. Il faut donc opérer des conversions de types explicites pour utiliser ces zones mémoire en fonction du type des données qui y seront mémorisées. #include main() { char *ptr; struct s_fiche { char nom[30]; int numero; struct s_fiche *suiv; } *fiche; ptr = (char *) malloc(80); /* demande d'allocation de 80 octets */ if ( ptr == NULL) {printf("Allocation mémoire impossible\n"); exit(1);} if (fiche = (struct s_fiche *) malloc(sizeof(struct s_fiche)) == NULL) {printf("Allocation mémoire impossible\n"); exit(1);} free(fiche); /* libération de la mémoire */ free(ptr); }

Demande d'allocation de mémoire ( calloc ) † La fonction calloc réserve un bloc de taille nelem x elsize octets consécutifs. Le bloc alloué est initialisé à 0. † Syntaxe : #include void *calloc(size_t nelem, size_t elsize); † Valeur retournée : Si succès, calloc retourne un pointeur sur le début du bloc alloué. Si échec, calloc retourne NULL s'il n'y a plus assez de place ou si nelem ou elsize valent 0. † Attention : Les fonctions d'allocation dynamique retournent des pointeurs sur des void. Il faut donc opérer des conversions de types explicites pour utiliser ces zones mémoire en fonction du type des données qui y seront mémorisées. #include int main() { int *str = NULL; str = (int *) calloc(10, sizeof(int)); printf("%d\n", str[9]); free(str); return 0; }

Demande d'allocation de mémoire ( realloc ) † La fonction realloc ajuste la taille d'un bloc à size octets consécutifs. † Syntaxe : #include void *realloc(void *ptr, size_t size); † Valeur retournée : Si succès, retourne l'adresse de début du bloc réalloué. Cette adresse peut avoir changé par rapport à celle fournie en argument. Dans ce cas, le contenu de l'ancien bloc est copié à la nouvelle adresse et l'ancienne zone est automatiquement libérée. Si échec, (pas assez de place en mémoire ou size à 0), realloc retourne la valeur NULL † Arguments : ptr : pointeur sur le début d'un bloc mémoire créé par malloc, calloc, ou realloc. Si ce pointeur est NULL, realloc équivaut à malloc. size : nouvelle taille du bloc en octets.

2 dimensions (matrices): double ** alloc_matrix(int n, int m) { double ** M = (double**)calloc(n,sizeof(double*)); int i; for(i=0; i<n; ++i) M[i] = (double*)calloc(m,sizeof(double)); return M; }

Libération!! La fonction free libère un bloc mémoire d'adresse de début ptr. J Syntaxe : #include void free(void *ptr); J Ce bloc mémoire a été précédemment alloué par une des fonctions malloc, calloc, ou realloc. J Attention : Il n'y a pas de vérification de la validité de ptr. Ne pas utiliser le pointeur ptr après free, puisque la zone n'est plus réservée. J A tout appel de la fonction malloc ( ou calloc ) doit correspondre un et un seul appel à la fonction free. #include int main() { char *str; str = (char *) malloc(100 * sizeof(char)); gets(str); /* saisie d'une chaine de caracteres */ /* suppression des espaces en tete de chaine */ while ( *str == ' ') str++; /* free ne libere pas toute la zone allouee car ptr ne designe plus le debut de la zone memoire allouee par malloc */ free(str); return 0; }

Déallocation de la mémoire de notre matrice 2 dimensions: void free_matrix(double** M, int n) { int i; for(i = 0; i<n; ++i) free(M[i]); free(M); }... free_matrix(M, 5); M = 0;

Arithmetique des pointeurs: H Il est possible de déplacer la position d'un pointeur en lui ajoutant ou en lui retranchant une valeur entière. Par exemple: ptr_str + 1 Le compilateur aqvance d'un ou plusieur octets par rapport à la position de ptr_str. H Les entiers ajoutés ou retranchés ont des tailles scalaires différentes selon le type du pointeur. En d'autres termes, ajouter ou soustraire 1 à un pointeur n'équivaut pas à se déplacer d'un octet, mais à aller à l'adresse suivante ou précédente.

+ Le format général du déplacement d'un pointeur est le suivant: pointeur + n  n est un entier positif ou négatif. pointeur est le nom de la variable déclarée ainsi: type* pointeur; + Le compilateur interprète l'expression pointeur + n comme suit: pointeur + n * sizeof(type) Arithmetique des pointeurs: p[1][2] + 3 == (*(p + 1))[2] + 3 == *(p[1] + 2) + 3 == *(*(p + 1) + 2) + 3

pointeurs sur fonctions: H Il est possible de déclarer un pointeur initialisé avec la valeur gauche (c'est à dire l'adresse) d'une fonction. On peut ensuite utilisé de pointeur pour appeler la fonction référencée: K int f(); K int (*fp)(); K int *g(); …… int f1(); int f2(); int (*fp)(); fp = &f1; (*fp)(); ……… void array_apply(double*, int, void (*)(double*)); void array_apply(double* a, int n, void (*f)(double*)) { int i; for(i=0; i<n; ++i) (*f)(a+i); } void triple(double *x) { *x *= 3; } void negate(double *x) { *x = - *x; }... double a[10] = {... }; array_apply(a,10,&triple); array_apply(a,10,&negate);