La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1. 2 3 4 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()

Présentations similaires


Présentation au sujet: "1. 2 3 4 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()"— Transcription de la présentation:

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


Télécharger ppt "1. 2 3 4 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()"

Présentations similaires


Annonces Google