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é?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top