Bolehkah Anda Menghantar Penunjuk tidak sah kepada Penunjuk Fungsi dalam C?

Barbara Streisand
Lepaskan: 2024-11-02 21:20:30
asal
456 orang telah melayarinya

Can You Cast void Pointers to Function Pointers in C  ?

Mengirimkan Penunjuk Tidak Sah kepada Penunjuk Fungsi dalam C

Menukar penunjuk tidak sah yang dikembalikan oleh fungsi seperti dlsym() kepada penunjuk fungsi tidak mudah dalam C . Secara lalai, pemutus langsung tersebut adalah dilarang dalam C 98/03.

Sebab Sekatan

Dalam C 98/03, penunjuk void* bertujuan untuk merujuk objek, bukan fungsi atau penunjuk ahli.

Sokongan Bersyarat dalam C 0x

Dalam C 0x, menghantar void* kepada penunjuk fungsi disokong secara pilihan oleh pelaksanaan. Jika disokong, tingkah laku mesti mematuhi standard.

Penyelesaian Bergantung kepada Pelaksanaan

Walaupun penghantaran terus tidak dibenarkan, penyelesaian ini mungkin berfungsi pada kebanyakan platform:

  • Mentafsir Semula Pelakon:
<code class="cpp">fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Salin selepas log masuk
  • Tafsiran Semula Pembolehubah:
<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Salin selepas log masuk

Penyelesaian ini mengeksploitasi fakta bahawa alamat penuding fungsi ialah objek dan boleh ditukar kepada penunjuk void** menggunakan reinterpret_cast.

Nota Awas

Penyelesaian ini melibatkan tingkah laku yang tidak ditentukan dan harus digunakan dengan budi bicara.

Atas ialah kandungan terperinci Bolehkah Anda Menghantar Penunjuk tidak sah kepada Penunjuk Fungsi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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