Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man in C einen Void-Zeiger sicher in einen Funktionszeiger umwandeln?

Wie kann man in C einen Void-Zeiger sicher in einen Funktionszeiger umwandeln?

Susan Sarandon
Susan SarandonOriginal
2024-11-05 00:43:02600Durchsuche

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

Funktionszeigerumwandlung in C

Frage:

Sie haben einen void-Zeiger, der von dlsym() zurückgegeben wurde, und Sie Sie müssen die Funktion aufrufen, auf die dieser leere Zeiger zeigt. Sie haben versucht, sowohl mit static_cast als auch mit reinterpret_cast zu konvertieren, aber keines von beiden hat funktioniert. Welche Möglichkeiten haben Sie?

Antwort:

Die direkte Umwandlung eines Void-Zeigers in einen Funktionszeiger ist in C 98/03 nicht zulässig. Es kann in C 0x bedingt unterstützt werden, sein Verhalten ist jedoch durch die Implementierung definiert.

Nicht-Standardlösungen:

Trotz der Mehrdeutigkeit des Standards gibt es mehrere Nicht-Standardlösungen Standardlösungen, die möglicherweise auf den meisten Plattformen funktionieren, obwohl sie als undefiniertes Verhalten gelten:

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 (Zeitlupe):

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

Diese Optionen nutzen die Tatsache aus, dass die Adresse eines Funktionszeigers ein Objektzeiger ist, was indirekte Möglichkeiten ermöglicht Casting mit reinterpret_cast.

Hinweis:

Diese Lösungen funktionieren nicht garantiert auf allen Plattformen und gelten nicht als Standard-C. Die Nutzung erfolgt auf eigene Gefahr.

Das obige ist der detaillierte Inhalt vonWie kann man in C einen Void-Zeiger sicher in einen Funktionszeiger umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn