Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menghantar Penunjuk Tidak Sah ke Penunjuk Fungsi dengan Selamat dalam C ?

Bagaimana untuk Menghantar Penunjuk Tidak Sah ke Penunjuk Fungsi dengan Selamat dalam C ?

Susan Sarandon
Lepaskan: 2024-11-05 00:43:02
asal
721 orang telah melayarinya

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

Penghantaran Penunjuk Fungsi 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>
Salin selepas log masuk

Pilihan 2:

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

Pilihan 3 (Gerak Perlahan):

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

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan