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



Documents pareils
Chapitre 1 : La gestion dynamique de la mémoire

Cours de C. Allocation dynamique. Sébastien Paumier

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

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

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

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

Conventions d écriture et outils de mise au point

Table des matières. Chapitre 4 : Variables pointeurs

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

Les structures de données. Rajae El Ouazzani

INITIATION A LA PROGRAMMATION

Le langage C. Séance n 4

Programmation en langage C Eléments de syntaxe

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

Gestion de la mémoire

Introduction au langage C

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

Algorithmique, Structures de données et langage C

Le prototype de la fonction main()

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

Analyse de sécurité de logiciels système par typage statique

INF 104 (SELC) Introduction au langage C

Les structures. Chapitre 3

Programmation impérative

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Algorithmique et Programmation, IMA

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

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

Claude Delannoy. 3 e édition C++

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

Programmation système I Les entrées/sorties

Initiation. àl algorithmique et à la programmation. en C

Java Licence Professionnelle CISII,

Architecture des ordinateurs

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

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

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Le langage C++ (partie I)

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Cours Programmation Système

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

Les chaînes de caractères

TP2 : tableaux dynamiques et listes chaînées

Cours d Algorithmique et de Langage C v 3.0

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

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

OS Réseaux et Programmation Système - C5

SUPPORT DE COURS. Langage C

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

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

COURS D'INFORMATIQUE: LANGAGE C NOTES DE COURS

Le langage C. Introduction, guide de reference

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

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

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Cours 6 : Tubes anonymes et nommés

Cours de C/C++ par la pratique. Hugues Talbot

Notes sur le Langage C

Programmation Orientée Objet Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

I. Introduction aux fonctions : les fonctions standards

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

Introduction au calcul parallèle avec OpenCL

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation en langage C


Derrière toi Une machine virtuelle!

Architecture des ordinateurs

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

TP : Gestion d une image au format PGM

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Les arbres binaires de recherche

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

Programmation Structurée Langage C

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

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

Programmation système de commandes en C

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Corrigés des premiers exercices sur les classes

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Arguments d un programme

Le traitement du temps

Package Java.util Classe générique

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

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

Rappels Entrées -Sorties

Cours de Système : Gestion de Fichiers

Les débordements de tampons et les vulnérabilités de chaîne de format 1

LE LANGAGE C++ ENAC 1997 A. DANCEL

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation en C/C++

Chap III : Les tableaux

Transcription:

Brefs rappels sur la pile et le tas (Stack / Heap) et les pointeurs (exemples en C) v1.11 - Olivier Carles 1

Pile et Tas Mémoire allouée de manière statique Mémoire Allouée Dynamiquement variables locales arguments valeur de retour Tas Pile v1.11 - Olivier Carles 2

Allocation statique et dynamique de la mémoirem moire char message[] = " Bonjour "; La mémoire m moire nécessaire n au stockage de message est connue à la compilation Allocation statique Que se passe-t-il pour un message non connu avant l exl exécution? Allocation dynamique : malloc(), calloc(), realloc() Libération : free() v1.11 - Olivier Carles 3

malloc() Prototype de la fonction : void * malloc(size_t num); size_t défini dans stdlib.h, généralement par unsigned int Alloue num octets pour le stockage et retourne l adresse du 1er octet Retourne NULL si échec "void*" est un type de pointeur générique g pouvant pointer sur tout type de donnée v1.11 - Olivier Carles 4

Exemple d utilisation de malloc() /* allocation pour une chaîne de 100 charactères res */ char * acharptr; acharptr = (char*) malloc(100); /* 50 entiers */ CAST int * anintarray; anintarray = (int*) malloc(50 * sizeof(int)); /* 10 réels */ float * afloatarray; afloatarray = (float*) malloc(10 * sizeof(float)); v1.11 - Olivier Carles 5

Conversion de type pointeur (CAST) Pourquoi (char *), (int( *), and (float *)? nième élem 2ème élem Tableau De combien d octets faut-il se déplacer en mémoire pour passer d un élément au suivant? Le type du pointeur donne ce nombre : c est la taille en octets du type T de (T*)malloc( ) 1er élem v1.11 - Olivier Carles 6

sizeof() Attention : la taille des entiers et réels est dépendante des systèmes mes. D où : utiliser sizeof() pour connaître la taille d un type. sizeof() fonctionne aussi pour les structures utilisateur aussi complexes soient- elles : malloc(n * sizeof(astructname astructname)) malloc(n * sizeof(avariablename avariablename)) v1.11 - Olivier Carles 7

Exemple : la liste chaînée e! /* liste.h */ struct Cell int valeur; struct Cell * suiv; }; typedef struct Cell Cell; Cell * ConstruitListe(int taille); void AfficheValeursCellules(Cell * tete); void LibereCellules(Cell * tete); v1.11 - Olivier Carles 8

La liste chaînée #include <stdlib.h< stdlib.h> #include <malloc.h< malloc.h> #include <stdio.h< stdio.h> #include "liste.h" liste.h" int main(void) Cell * tete; tete = ConstruitListe(10); /* BP1 Cf mémoiremoire sur transp. suivant */ AfficheValeursCellules(tete); DetruitListe(tete); } return 1; v1.11 - Olivier Carles 9

La liste chaînée Cell * ConstruitListe(int taille) int i; Cell * cour,, * tete; } tete = NULL; for(i = 1; i <= taille; ; i++) cour = (Cell *) malloc(sizeof(cell)); ); cour->valeur = i; cour->suiv = tete; /* BP2 Cf + loin */ tete = cour; } return tete; v1.11 - Olivier Carles 10

La liste chaînée void AfficheValeursCellules(Cell * tete) } Cell * cour = tete; while(cour) } printf("%d\n", ", cour->valeur valeur); cour = cour->suiv suiv; v1.11 - Olivier Carles 11

La liste chaînée void DetruitListe(Cell * tete) Cell * temp; while(tete) temp = tete; tete = temp->suiv suiv; free(temp); } } v1.11 - Olivier Carles 12

En mémoire, m moire, au point d arrêt d BP1 tete suiv suiv Pour main() valeur 10 valeur 9... suiv suiv valeur 2 valeur 1 Pile Tas v1.11 - Olivier Carles 13

En mémoire, m moire, au point d arrêt d BP2 tete cour suiv i taille (param. Fct ) 2 10 valeur 1 Pour ConstruitListe() tete? Pour main() suiv valeur 2 Pile Tas v1.11 - Olivier Carles 14

calloc() (Cf. malloc()) void * calloc(size_t num, size_t size); Alloue un bloc (tableau) mémoiremoire pour num éléments de taille size octets chacun Exemple : /* allocation pour un tableau de 5 éléments de type Cell */ Cell * acellptr; acellptr = (Cell*) calloc(5, sizeof(cell)); v1.11 - Olivier Carles 15

free() La mémoire m moire disponible pour le tas est évidemment de taille finie donc il faut libérer les blocs mémoiresm moires alloués quand ils ne sont plus utilisés void free(void * ptr); Sans effet si ptr == NULL NB : pas de taille en octets à indiquer v1.11 - Olivier Carles 16

realloc() void * realloc(void * memblock,, size_t size); Change la taille d un bloc mémoiremoire indiqué par memblock en un bloc de size octets Plusieurs cas : realloc() se passe bien : retourne l adresse du bloc realloué (éventuellement returne memblock si une simple extension du bloc a été possible). Si memblock == NULL, équivalent à malloc() Si size == 0, équivalent à free(), retourne NULL Si pas assez de mémoire, retourne NULL v1.11 - Olivier Carles 17

En règle r généraleg Ne jamais supposer qu une une opération d allocation d dynamique de mémoire m moire s est bien dérould roulée Donc toujours tester les valeurs retournées es par les fonctions #include <stdlib.h> #include <malloc.h> #include <stdio.h> int main() char * string; string = malloc(10000); if( string == NULL ) /* if (!string) */ printf( ( "Not" enough memory!\n" ); else printf( ( "Memory space allocated\n" ); free( string ); printf( ( "Memory freed\n" ); } return 0; } v1.11 - Olivier Carles 18