Bonjour à tous,
Comme vous le savez, il est possible de réaliser des affectations entre des pointeurs sur des objets et des pointeurs de type void * sans conversion explicite. Mais pourquoi n'en est-il pas de même avec les pointeurs de type void ** ?
Par exemple, j'aimerais créer une fonction qui alloue de la mémoire pour une matrice et une autre qui libère la mémoire allouée pour une matrice :
Et pour les utiliser, je suis obligé de caster le retour de matrix_create et l'argument de matrix_free pour ne pas avoir de warning à la compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void **matrix_create(<...>){ void **m; /* allocation mémoire */ return m; } void matrix_free(void **m){ /* corps de la fonction */ }
Pour éviter ces cast, peut-on (doit-on) définir les fonctions ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <stdlib.h> int main(void){ int **m = (int **)matrix_create(<...>); /* traitement */ matrix_free((void **)m); return EXIT_SUCCESS; }
(--> retour de type void * au lieu de void **)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void *matrix_create(<...>){ void **m; /* allocation mémoire pour m */ return m; }
(--> paramètre de type void * au lieu de void **)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void matrix_free(void *m){ /* conversion pour pouvoir déréférencer le paramètre */ void **mm = (void **)m; /* libération mémoire de mm */ }
?
Partager