pointeur sur pointeur générique
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 :
Code:
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 */
} |
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:
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;
} |
Pour éviter ces cast, peut-on (doit-on) définir les fonctions ainsi :
Code:
1 2 3 4 5
| void *matrix_create(<...>){
void **m;
/* allocation mémoire pour m */
return m;
} |
(--> retour de type void * au lieu de void **)
Code:
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 */
} |
(--> paramètre de type void * au lieu de void **)
?