C - Quand est-ce que le casting est nul?
J'ai été à la recherche à Advanced Linux Programmation par Mitchell, Oldham et Samuel. J'ai vu dans la section sur les pthreads quelque chose à propos de nulle pointeurs et de la coulée qui me confond.
Passage d'un argument à pthread_create(), ils ne jette pas le pointeur vers un pointeur void même si c'est ce que la fonction attend.
pthread_create( &thread, NULL, &compute_prime, &which_prime );
Ici, which_prime est de type int.
Mais en prenant une valeur de retour du thread à l'aide de pthread_join, ils NE jeter la variable pointeur void.
pthread_join( thread, (void*) &prime );
Ici, premier est de type int de nouveau.
Pourquoi est coulée dans le second exemple, et non pas dans la première?
source d'informationauteur Amoeba
Vous devez vous connecter pour publier un commentaire.
Le deuxième exemple est un bon exemple de pourquoi casting pour
void*
est généralement une erreur. Il devrait êtreparce que
pthread_join
prend unvoid**
comme second argument. Levoid*
permet seulement de garantir le bug passe le compilateur parce que levoid*
est converti àvoid**
automatiquement.Donc, quand ne vous avez besoin de jeter à
void*
ou à l'arrière:(u)intptr_t
);void*
(ou de prendre un autre type de pointeur et vous avezvoid*
); ce qui signifie généralement des fonctions prenant un nombre variable d'arguments tels queprintf
.Pas besoin de cast ou à partir d'un pointeur vers
void
dans C:Les seules exceptions sont
"%p"
indicateur de conversion comme il est défini uniquement pour lesvoid *
.intptr_t
ouuintptr_t
retour à unvoid *
.En C, la conversion de void* à partir de n'importe quel type de pointeur et vice-versa est fait implicitement.
Il n'est pas nécessaire pour le casting dans le deuxième exemple.
(À noter qu'en C++, casting un pointeur de type void* est également fait implicitement (sauf pour les pointeurs de fonction et de la fonction-membre /méthode des indicateurs qui ne peuvent pas être exprimées à void*), mais la coulée arrière nécessite un cast explicite.)
Je crois que le même code a été référencé dans d'autres questions.
La réponse dans le deuxième lien explique:
Et le texte cité:
Que par la de la documentation,
Donc, le
pthread_join
prend unpointer to void*
comme second argument. C'est parce que,Maintenant, à votre question, "Pourquoi est coulée dans le second exemple, et non pas dans la première?"
Dans le premier cas, c'est à dire,
pthread_create
, il s'attend à unvoid*
comme quatrième argument. Donc, en passant&which_prime
serait implicitement converti àvoid*
.Dans le deuxième exemple, c'est à dire,
pthread_join
il s'attend à unvoid**
et nous sommes en train de&prime
. Ainsi, le compilateur va se plaindre. Donc, pour contourner le bug, l'auteur passe un casting devoid*
qui sera automatiquement convertie àvoid**
.Mais ce n'est pas une bonne solution. Même l'auteur de devis::
La Solution::
Ou, si vous ne voulez pas changer la mise en œuvre de
prime
commeint
Comme, @larsmans ont mis en œuvre,