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 : 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 */
}
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
#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 : 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;
}
(--> 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_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 **)

?