Salut,
Le passage de paramètres en C se fait par copie. Un exemple simple,
Pas bon :
1 2 3 4 5 6 7 8 9 10 11
| void ajoute1(int a)
{
a++;
}
int main()
{
int a=2;
ajoute1(a);
// ici a vaut toujours 2 car une copie de a a été passée 1 à ajoute1
} |
Meilleur :
1 2 3 4 5 6 7 8 9 10 11 12 13
| void ajoute1(int *a)
{
(*a)++;
}
int main()
{
int a=2;
ajoute1(&a);
// ici a vaut 3. C'est comme avec scanf ...
// une copie du pointeur est passée, mais comme la copie et
// l'original pointent au même endroit ...
} |
Tu devras donc avoir une déclaration du genre :
void allocat (int *** ptr_pbmPic, int height);
Dans ta version il y a une erreur, tu écris :
pbmPic = malloc((height + 1)*sizeof(int));
or pbmPic est de type int**, le malloc devrait contenir un sizeof(int**) et non un sizeof(int).
Une version (non testée, écrite à la volée) :
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
| void allocat (int ***ptr_pbmPic, int height)
{
int c = 0, l = 0;
/* correction du sizeof avec le type */
*ptr_pbmPic = malloc((height + 1)*sizeof(int**));
if (!(*ptr_pbmPic))
{
printf("\nERREUR: echec de l'alloc. dyn. à la zone pixel (main)\n");
exit(EXIT_FAILURE);
}
for (l = 0; l < (height + 1); l++)
{
(*ptr_pbmPic)[l] = malloc(240*sizeof(int*));
if (!((*ptr_pbmPic)[l]))
{
printf("\nERREUR: echec de l'alloc. dyn. à la zone pixel (sec.)\n");
for (c = 0; c < l; c++)
{
free(((*ptr_pbmPic)[c]));
}
free(*ptr_pbmPic);
exit(EXIT_FAILURE);
}
}
} |
J'ai volontairement surchargé les écritures ...
Dans le main tu pourras faire un :
1 2
| int** pbmPic;
allocat(&pbmPic, 8); |
Il n'y a pas de moyen pour savoir si un free a échoué ou non. Tu peux vérifier si ton programme a des fuites de mémoire avec des outils comme valgrind.
Partager