Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menghantar Penunjuk Tidak Sah ke Penunjuk Fungsi dengan Selamat dalam C ?
Soalan:
Anda mempunyai penunjuk tidak sah dikembalikan oleh dlsym(), dan anda perlu memanggil fungsi yang ditunjuk oleh penunjuk kosong ini. Anda telah mencuba menghantar dengan static_cast dan reinterpret_cast, tetapi kedua-duanya tidak berjaya. Apakah pilihan yang anda ada?
Jawapan:
Menukar langsung penunjuk kosong kepada penuding fungsi tidak dibenarkan dalam C 98/03. Ia mungkin disokong secara bersyarat dalam C 0x, tetapi kelakuannya ditakrifkan pelaksanaan.
Penyelesaian Bukan Piawai:
Walaupun kesamaran standard, terdapat beberapa bukan- penyelesaian standard yang mungkin berfungsi pada kebanyakan platform, walaupun ia dianggap gelagat tidak ditentukan:
Pilihan 1:
<code class="cpp">typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Pilihan 2:
<code class="cpp">fptr my_fptr = 0; reinterpret_cast<void*&>(my_fptr) = gptr;</code>
Pilihan 3 (Gerak Perlahan):
<code class="cpp">void (**object_ptr)() = &my_ptr; void **ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
Pilihan ini mengeksploitasi fakta bahawa alamat penuding fungsi ialah penuding objek, membenarkan untuk tidak langsung menghantar menggunakan reinterpret_cast.
Nota:
Penyelesaian ini tidak dijamin berfungsi pada semua platform dan tidak dianggap standard C . Gunakannya atas risiko anda sendiri.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Penunjuk Tidak Sah ke Penunjuk Fungsi dengan Selamat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!