C: Fonction retournant via void *
-
10-07-2019 - |
Question
Venant de Java, l'utilisation de Void permet de donner une valeur de retour comme suit:
void *emalloc(size_t s) {
void *result = malloc(s);
if (NULL == result) {
fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");
exit( EXIT_FAILURE );
}
return result;
}
Est-ce que cela renvoie un pointeur sur un bloc de mémoire alloué?
La solution
Oui, c'est ça. Un pointeur * vide est essentiellement un pointeur générique vers une adresse mémoire, qui peut ensuite être converti en caractères typographiques selon le type souhaité.
Autres conseils
Votre question indique que vous avez mal interprété le type de retour de la fonction. Il y a une grande différence entre:
void foo( void ) {}
et
void *bar( void ) {}
foo () ne prend aucun argument et ne renvoie pas de valeur, tandis que bar () ne prend aucun argument et renvoie un pointeur générique. En C, le mot clé void est utilisé pour indiquer un pointeur générique et un objet de type void * peut être converti en tout autre type de pointeur d'objet sans perte d'informations.
Oui, cette fonction renvoie un pointeur sur la mémoire allouée d’une taille spécifiée. C'est différent dans malloc dans le sens où il est garanti de retourner un pointeur. En cas d'échec, il va quitter l'application.
Oui. void *
signifie un pointeur sur quelque chose, mais pas de type particulier.
void signifie essentiellement pas de type, donc si nous avons void * p; p est un pointeur sur quelque chose, mais nous n'avons pas dit quoi.
void sans pointeur n'est rien donc void foo (void) étant une fonction qui ne prend aucun argument et ne retourne rien.
Et oui, malloc renvoie un pointeur sur une partie de la mémoire, malloc ne sait pas ou ne se soucie pas du type de cette mémoire, donc son type de retour est void *
En Java, il n’existe pas d’arithmétique de pointeur. Je pense que c'est ce que vous demandez. Par exemple, imaginons que malloc
renvoie un pointeur de type int
int* malloc(size_t size)
{
//
}
Vous pourriez éventuellement recevoir le pointeur, qui est fondamentalement un pointeur sur un tableau
. Ensuite, vous l’indexerez comme des tableaux classiques.
int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).
Le problème est que C
n'a pas de fonctions surchargées. Nous devons donc trouver un moyen d’écrire un malloc
générique. Sinon, vous obtiendrez un malloc
différent pour chaque type. La solution consiste à envoyer le nombre d'octets requis. Ensuite, vous pouvez l'indexer comme bon vous semble. Cela donne une plus grande flexibilité et une solution pour tous.
int* i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte
int thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)
Donc, l'idée est que la façon dont nous indexons la mémoire obtenue de malloc
n'a aucune importance. Tout ce que nous avons à faire est de spécifier le type du tableau nouvellement créé pour l'indexer correctement. void *
signifie qu'il s'agit d'un pointeur à placer en mémoire que nous n'avons pas spécifié comment indexer.