2010-10-01 3 views
2

Est-il sûr de convertir un int pointer en void pointer puis de nouveau à int pointer?Interconversion pointeur à pointeur

main() 
{ 
    ... 
    int *a = malloc(sizeof(int)); 
    ... 
    *a=10; 
    func(a); 
    ... 
} 

void func(void *v) 
{ 
    int x=*(int *)v; 
    ... 
} 

Est-ce une manière valide de récupérer la valeur entière dans la fonction?

+0

Et quelle est exactement la motivation pour écrire du code comme ça? – NullUserException

+1

@NullUserException, en transmettant une valeur persistante à une fonction de thread de thread. Voir pthread_create pour plus d'informations. –

Répondre

6

Oui, c'est sans danger. La norme le dit (6.3.2.3/1)

Un pointeur à vide peut être converti en ou à partir d'un pointeur à un type incomplet ou d'un objet. Un pointeur vers un type incomplet ou un objet peut être converti en un pointeur vers void et vice versa; le résultat doit être égal au pointeur d'origine.

5

Il est "sûr" dans la mesure où le pointeur résultant de la conversion int => void => int sera le même que le pointeur d'origine. Il n'est pas "sûr" dans la mesure où il est facile de se tromper et que vous devez faire attention (ce type de code est souvent nécessaire en C, car void* est souvent utilisé comme une forme de généralisation).

Questions connexes