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() {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 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
8
9
10
11 L’ajout d’un élément nouveau
12 L’ajout d’un élément nouveau
13 L’ajout d’un élément nouveau L’ancien tableau n’existe plus
14 L’adresse du nouveau tableau
15
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 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
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 #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 Allocation Remplissage et affichage
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 Modification de la taille Affichage de la nouvelle zone
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 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 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: tab=2357:0912 tab=2357:0906
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 tab=0000:0000
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 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 # 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 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 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