1 pièce(s) jointe(s)
(Re)Allocation dynamique de mémoire dans une fonction
Bonjour,
après recherche et lecture d'informations, j'effectue quelques tests sur un cas "simple" afin de bien comprendre l'allocation et la libération de mémoire avec fonction
Je cherche juste à modifier la taille d'un tableau d'entiers dans 4 codes différents comme ceci :
- realloc-1.c : realloc dans la fonction principale + variable locale
- realloc-2.c : realloc dans la fonction principale + variable globale
- realloc-3.c : realloc dans une sous-fonction + variable globale
- realloc-4.c : realloc dans une sous-fonction + passage par adresse
Tous les codes semblent tourner sans erreur mais je voulais avoir confirmation auprès de membres plus expérimentés. Ces codes sont-ils propres ?
Le but final étant bien entendu d'utiliser la dernière méthode, donc si vous pouviez au moins me donner votre avis sur cette version...
PS : ne vous attardez pas trop sur les fonctions disp et setvalk (sauf erreur flagrante).
Merci
Stupendous Man (autodidacte)
realloc-1.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #include "rea.h"
int disp(int *, size_t);
int setvalk(int *, size_t);
int main(void) {
int chk;
int *M = NULL, *temp = NULL;
size_t n[4], i;
n[0] = (size_t)N0;
n[1] = n[0]*800;
n[2] = n[1]/400;
n[3] = n[2]*1000;
printf("\nDebut\n\n");
for(i=0;i<4;i++) {
temp = realloc(M, n[i]*sizeof(M));
if(temp==NULL) {
fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
if(i>0)
FREE(M);
return -1;
}
else {
M = temp;
temp = NULL;
printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
}
chk = setvalk(M, n[i]);
printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
if(chk==-1)
break;
chk = disp(M, n[i]);
printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
if(chk==-1)
break;
printf("\n\n");
}
if(M!=NULL)
FREE(M);
if(temp!=NULL)
FREE(temp);
printf("\nFin\n");
return 0;
}
int disp(int * ptr, size_t n) {
size_t i;
printf(" M (Adr: %p) = [ ", ptr);
if(n>AFFMAX) {
for(i=0;i<AFFMAX;i++)
printf("%d ", ptr[i]);
printf("...]; ");
}
else {
for(i=0;i<n;i++)
printf("%d ", ptr[i]);
printf("];");
for(i=0;i<2*(AFFMAX-n+2);i++)
printf(" ");
}
return 0;
}
int setvalk(int * ptr, size_t n) {
size_t i;
for(i=0;i<n;i++)
ptr[i] = k;
k++;
return 0;
} |
realloc-2.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include "rea.h"
int disp(size_t);
int setvalk(size_t);
int *M = NULL;
int main(void) {
int chk;
int *temp = NULL;
size_t n[4], i;
n[0] = (size_t)N0;
n[1] = n[0]*800;
n[2] = n[1]/400;
n[3] = n[2]*1000;
printf("\nDebut\n\n");
for(i=0;i<4;i++) {
temp = realloc(M, n[i]*sizeof(M));
if(temp==NULL) {
fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
if(i>0)
FREE(M);
return -1;
}
else {
M = temp;
temp = NULL;
printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
}
chk = setvalk(n[i]);
printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
if(chk==-1)
break;
chk = disp(n[i]);
printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
if(chk==-1)
break;
printf("\n\n");
}
if(M!=NULL)
FREE(M);
if(temp!=NULL)
FREE(temp);
printf("\nFin\n");
return 0;
}
int disp(size_t n) {
size_t i;
printf(" M (Adr: %p) = [ ", M);
if(n>AFFMAX) {
for(i=0;i<AFFMAX;i++)
printf("%d ", M[i]);
printf("...]; ");
}
else {
for(i=0;i<n;i++)
printf("%d ", M[i]);
printf("];");
for(i=0;i<2*(AFFMAX-n+2);i++)
printf(" ");
}
return 0;
}
int setvalk(size_t n) {
size_t i;
for(i=0;i<n;i++)
M[i] = k;
k++;
return 0;
} |
realloc-3.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include "rea.h"
int disp(size_t);
int setvalk(size_t);
int reallocM(size_t);
int *M = NULL;
int main(void) {
int chk;
size_t n[4], i;
n[0] = N0;
n[1] = n[0]*800;
n[2] = n[1]/400;
n[3] = n[2]*1000;
printf("\nDebut\n\n");
for(i=0;i<4;i++) {
chk = reallocM(n[i]);
if(chk==0)
printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
else {
fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
if(i>0)
FREE(M);
return -1;
}
chk = setvalk(n[i]);
printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
if(chk==-1)
break;
chk = disp(n[i]);
printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
if(chk==-1)
break;
printf("\n\n");
}
if(M!=NULL)
FREE(M);
printf("\nFin\n");
return 0;
}
int disp(size_t n) {
size_t i;
printf(" M (Adr: %p) = [ ", M);
if(n>AFFMAX) {
for(i=0;i<AFFMAX;i++)
printf("%d ", M[i]);
printf("...]; ");
}
else {
for(i=0;i<n;i++)
printf("%d ", M[i]);
printf("];");
for(i=0;i<2*(AFFMAX-n+2);i++)
printf(" ");
}
return 0;
}
int setvalk(size_t n) {
size_t i;
for(i=0;i<n;i++)
M[i] = k;
k++;
return 0;
}
int reallocM(size_t n) {
int *temp=NULL;
temp = realloc(M,n*sizeof(*M));
if(temp==NULL) {
if(M!=NULL)
FREE(M);
return -1;
}
else {
M = temp;
temp = NULL;
}
return 0;
} |
realloc-4.c :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include "rea.h"
int disp(int *, size_t);
int setvalk(int *, size_t);
int reallocM(int **, size_t);
int main(void) {
int *M = NULL;
int chk;
size_t n[4], i;
n[0] = N0;
n[1] = n[0]*800;
n[2] = n[1]/400;
n[3] = n[2]*1000;
printf("\nDebut\n\n");
for(i=0;i<4;i++) {
chk = reallocM(&M, n[i]);
if(chk==0)
printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
else {
fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
if(i>0)
FREE(M);
return -1;
}
chk = setvalk(M, n[i]);
printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
if(chk==-1)
break;
chk = disp(M, n[i]);
printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
if(chk==-1)
break;
printf("\n\n");
}
if(M!=NULL)
FREE(M);
printf("\nFin\n");
return 0;
}
int disp(int * ptr, size_t n) {
size_t i;
printf(" M (Adr: %p) = [ ", ptr);
if(n>AFFMAX) {
for(i=0;i<AFFMAX;i++)
printf("%d ", ptr[i]);
printf("...]; ");
}
else {
for(i=0;i<n;i++)
printf("%d ", ptr[i]);
printf("];");
for(i=0;i<2*(AFFMAX-n+2);i++)
printf(" ");
}
return 0;
}
int setvalk(int * ptr, size_t n) {
size_t i;
for(i=0;i<n;i++)
ptr[i] = k;
k++;
return 0;
}
int reallocM(int ** ptr, size_t n) {
int *temp=NULL;
temp = realloc(*ptr,n*sizeof(**ptr));
if(temp==NULL) {
return -1;
}
else {
*ptr = temp;
temp = NULL;
}
return 0;
} |
rea.h :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #ifndef H_REA
#define H_REA
#include <stdio.h>
#include <stdlib.h>
#define N0 200
#define AFFMAX 9
#define FREE(p) free(p);\
p = NULL;
int k = 0;
#endif |