Maison  >  Article  >  développement back-end  >  Comment convertir en toute sécurité un pointeur vide vers un pointeur de fonction en C ?

Comment convertir en toute sécurité un pointeur vide vers un pointeur de fonction en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-05 00:43:02606parcourir

How to Safely Cast a Void Pointer to a Function Pointer in C  ?

Casting de pointeur de fonction en C

Question :

Vous avez un pointeur vide renvoyé par dlsym(), et vous besoin d'appeler la fonction pointée par ce pointeur vide. Vous avez essayé de diffuser avec static_cast et reinterpret_cast, mais aucun n'a fonctionné. Quelles options avez-vous ?

Réponse :

La conversion directe d'un pointeur vide en pointeur de fonction est interdite dans C 98/03. Il peut être pris en charge sous condition en C 0x, mais son comportement est défini par l'implémentation.

Solutions non standard :

Malgré l'ambiguïté de la norme, il existe plusieurs solutions non standard. solutions standard qui peuvent fonctionner sur la plupart des plates-formes, bien qu'elles soient considérées comme un comportement non défini :

Option 1 :

<code class="cpp">typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>

Option 2 :

<code class="cpp">fptr my_fptr = 0;
reinterpret_cast<void*&>(my_fptr) = gptr;</code>

Option 3 (Slow Motion) :

<code class="cpp">void (**object_ptr)() = &my_ptr;
void **ppv = reinterpret_cast<void**>(object_ptr);
*ppv = gptr;</code>

Ces options exploitent le fait que l'adresse d'un pointeur de fonction est un pointeur d'objet, permettant une casting à l'aide de reinterpret_cast.

Remarque :

Ces solutions ne sont pas garanties de fonctionner sur toutes les plates-formes et ne sont pas considérées comme la norme C . Utilisez-les à vos propres risques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn