Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parDelphine Guyon Modifié depuis plus de 9 années
1
1
2
2
3
3
4
4
5
5 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() {int * p; p = (int *)malloc (sizeof(int)); if ( p == NULL ) { fprintf(stderr,"Allocation impossible \n"); exit(EXIT_FAILURE); } } Message d’erreur Allocation pour un nombre entier Le contenu de la zone allouée est aléatoire. La fonction alloue un bloc de taille size.
6
6 Allocation pour un tableau de 3 nombres réels #include void main() {float * tab; tab = (float *)malloc (3*sizeof(float)); if ( tab == NULL ) { fprintf(stderr,"Allocation impossible \n"); exit(EXIT_FAILURE); } } Allocation pour un tableau
7
7
8
8
9
9
10
10
11
11 L’ajout d’un élément nouveau
12
12 L’ajout d’un élément nouveau
13
13 L’ajout d’un élément nouveau L’ancien tableau n’existe plus
14
14 L’adresse du nouveau tableau
15
15
16
16 La fonction ne fait qu’un changement de taille. On peut ajouter ou enlever une case à la fin d’un tableau dynamique sans le modifier. #include 1/2 #include void main() {int * tab,i; tab = (int *)calloc (3, sizeof(int)); if ( tab == NULL ) { fprintf(stderr,"Allocation impossible \n"); exit(EXIT_FAILURE); } tab[0]=1; tab[1]=2; tab[2]=3; Création d’un tableau de 3 entiers Initialisation
17
17 tab=(int *)realloc(tab, 4 * sizeof(int)); 2/2 tab[3]=4; for(i=0;i<4;i++) printf(“tab[%d]=%d\n”,i,tab[i]); } Ajout d’un élément au tableau tab[0]=1 tab[1]=2 tab[2]=3 tab[3]=4 Initialisation Affichage du tableau
18
18
19
19 Si vous tentez de libérer un pointeur NULL la fonction ne fera strictement rien. Si vous libérer un bloc qui a précédement été désalloué, le comportement de la fonction est alors indéterminé. Il faut forcer le pointeur que l'on vient de libérer à la valeur NULL.... int * entier= (int *)malloc (sizeof(int)); if( entier == NULL ) { fprintf(stderr,"Allocation impossible");} else { *entier = 3; printf("%d",*entier); free(entier); entier = NULL; } printf("%d",*t);... libération erreur
20
20 #include 1/2 #include void main() { int *sptr,*eptr,*current; sptr=(int*)calloc(7,sizeof(int)); if( sptr == NULL ) { fprintf(stderr,"Allocation impossible");exit(1);} eptr=sptr+7; printf("Avant realloc\n"); for(current=sptr;current<eptr;current++) {*current=rand(); printf("%d\n",*current); } Exemple 1 Réserver de la mémoire pour 7 éléments entiers. Remplir la zone avec nombres arbitraires et les afficher. Modifier la taille de la mémoire préalablement alloué et afficher la nouvelle zone. Avant realloc 346 130 10982 1090 11656 7117 17595 Allocation Remplissage et affichage
21
21 2/2 printf("Appuyer une touche!\n"); getch(); sptr=(int*)realloc(sptr,20); if( sptr == NULL ) { fprintf(stderr,"Allocation impossible"); exit(1); } eptr=sptr+12; printf("Apres realloc\n"); for(current=sptr;current<eptr;current++) printf("%d\n",*current); free(sptr); sptr=NULL; } Exemple 1 Appuyer une touche! Apres realloc 346 130 10982 1090 11656 7117 17595 4360 9175 32004 0 Modification de la taille Affichage de la nouvelle zone
22
22 #include void main() { int *sptr,*eptr,*current,*min_ptr; int min; sptr=(int*)calloc(7,sizeof(int)); if( sptr == NULL ) { fprintf(stderr,"Allocation impossible");exit(1);} eptr=sptr+7; for(current=sptr;current<eptr;current++) *current=rand(); min=*sptr; min_ptr=sptr; for(current=(sptr+1);current<eptr;current++) if(*current<min) { min=*current; min_ptr=current; } printf("Avant realloc:min=%d,min_ptr=%p\n",min,min_ptr); Exemple 2 Faire les même réservations de la mémoire. Trouver l’ élément plus petit. Voir comment se déplace le pointeur. Allocation et remplissage L’ élément minimal
23
23 sptr=(int*)realloc(sptr,20); if( sptr == NULL ) { fprintf(stderr,"Allocation impossible"); exit(1); } eptr=sptr+12; min=*sptr; min_ptr=sptr; for(current=(sptr+1);current<eptr;current++) if(*current<min) { min=*current; min_ptr=current; } printf("Apres realloc:min=%d,min_ptr=%p\n",min,min_ptr); free(sptr); sptr=NULL; } Avant realloc:min=130,min_ptr=24BF:0904 Apres realloc:min=0,min_ptr=23D7:00F4 Exemple 2 Faire les même réservations de la mémoire. Trouver l’ élément plus petit. Voir comment se déplace le pointeur. Modification de la taille
24
24 Exemple 3 #include 1/2 #include #define element float void main() { element *tab; int i; tab=(element *)calloc(3,sizeof( element )); printf("tab=%p\n",tab); for(i=0;i<3;i++) printf("%6.2f",*tab++); printf("\n"); printf("tab=%p\n",tab); tab-=3 ; //retour de pointeur printf("tab=%p\n",tab); Pointeur sur le tableau tab=2357:0906 0.00 0.00 0.00 tab=2357:0912 tab=2357:0906
25
25 Exemple 3 for(i=0;i<3;i++) 2/2 { *tab=i+1; printf("%6.2f",*tab++); } printf("\n"); tab-=3 ; free(tab); tab=NULL; printf("tab=%p\n",tab); } Remplissage du tableau et affichage Si on n’a pas besoin du tableau 1.00 2.00 3.00 tab=0000:0000
26
26 #include 1/2 #include main() { char *ip, *chaine="Programmation"; int nbr,i, nitems; nbr = 1; ip = (char *)malloc(nbr*sizeof(char)); /* reservation initialle */ if(ip == NULL) { printf("memoire n'est pas reservee\n"); exit(1); } Exemple 3 : lire des caractères d’une chaine des caractères et les déplacer dans un tableau dynamique
27
27 nitems = 0; 2/2 while(*chaine != NULL) { if(nitems >= nbr) { /* reservation de la memoire supplementaire */ nbr += 1; ip = (char *)realloc(ip, nbr * sizeof(char)); if(ip == NULL) { printf("memoire n'est pas reservee\\n"); exit(1); } } ip[nitems++] = *chaine++; } *chaine=NULL; for(i=0;i<nbr;i++) putchar(*ip++); } Exemple 3 : lire des caractères d’une chaine des caractères et les déplacer dans un tableau dynamique Programmation
28
28 # include float* saisie(float * tab,int *nb); void affiche(float * tab,int nb); void main() { float* tab; int nb; tab=saisie (tab,&nb); affiche (tab,nb); } Exemple 4 : Écrire un programme qui saisit les nombres réels (nombre inconnus) au clavier pour remplir un tableau dynamique. Afficher le tableau dynamique à l’écran.
29
29 float* saisie(float *tab,int *nb) { int i=0; int rez=1; *nb=1; printf("\nC'est parti pour la saisie des valeurs\n"); tab=(float *)malloc(*nb*sizeof(float)); if(tab==NULL) exit(1); do { if(i >= *nb) { (*nb)++; tab= (float *)realloc(tab,*nb*sizeof(float)); if(tab==NULL) exit(1); } printf("position %d : donnez la valeur : ",i); rez=scanf("%f",&tab[i]); i++; } while(rez); *nb-=1; return tab; } Modification de la taille Allocation initial
30
30 void affiche(float * tab,int nb) { int i; printf("\nle tableau contient %d valeurs",nb); printf("\nvaleurs du tableau : "); for (i=0;i<nb;i++,tab++) printf ("\n\tposition %d : %f",i,*tab); }
31
31
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.