53 votes

Dois-je explicitement convertir la valeur de retour de malloc ()?

Je voulais poser des questions sur le cas suivant:

char *temp;
temp = malloc(10);

Depuis le type de retour d' malloc est void*, le pointeur retourné par l' malloc être implicitement convertie en char* type avant d'être assigné à temp? Quelle est la norme de dire à cet égard?

Si notre pointeur de variable est un certain type struct par exemple:

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));

Si nous allouer de la mémoire à la température sans moulage struct node* type, il est implicitement convertie en struct node* type ou est-il nécessaire de convertir explicitement à struct node* type?

51voto

unwind Points 181987

Si vous aimez le "don't repeat yourself" état d'esprit, il doit être attrayant que vous n'avez pas besoin de répéter le nom du type de la déclaration de la variable, en malloc() appel. Parce que, comme les gens l'ont souligné, vous n'avez pas: les pointeurs convertir void * sans perte, à l'exception des pointeurs de fonction.

Aussi, sur cette note, vous n'avez pas besoin de répéter vous-même avec l'utilisation de l' sizeof . Votre deuxième exemple, lors de l'affectation de la structure, peut être écrite comme ceci:

struct node *temp;
temp = malloc(sizeof *temp);

Qui, dans mon pas si humble avis c'est le meilleur moyen.

En évitant de se répéter, réduit le nombre de choses que vous écrivez, qui, à son tour, réduit le risque que l'une de ces choses sont fausses.

Note de l'astérisque dans l' sizeof argument, ce qui signifie "la taille de l'objet pointé par le pointeur", ce qui est évidemment le même que "la taille du type struct node" mais sans répéter le nom du type. C'est parce qu' sizeof calcule (au moment de la compilation!) la taille de l'expression qui est son argument. Pour ce cas. Tout comme sizeof 3 calcule la taille d'une expression de type int, sizeof *temp calcule la taille d'une instance de struct node.

Bien sûr, vous ne répétez quelque chose, c'est à dire le nom de la variable elle-même, mais c'est souvent plus simple expression et la plus facile pour obtenir le droit, et peut également être plus facile pour le compilateur de repérer une erreur.

33voto

tekBlues Points 4346

Un pointeur vide en C peut être affecté à n’importe quel pointeur sans conversion explicite.

10voto

sth Points 91594

C lance implicitement de et vers void* , de sorte que le casting sera effectué automatiquement. En C ++, seule la conversion en void* serait effectuée implicitement; pour l’autre sens, une conversion explicite est requise.

3voto

Martin Beckett Points 60406

En C ++, vous devez explicitement transtyper, mais il s’agit en réalité du langage qui vous dissuade de le faire.
Dans c, il n’est pas vraiment nécessaire de lancer un casting, la mémoire n’est que mémoire. Je vais devoir faire une recherche pour voir si le dernier standard C le requiert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X