Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Anda Menghantar Penunjuk tidak sah kepada Penunjuk Fungsi dalam C?

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

Barbara Streisand
Barbara Streisandasal
2024-11-02 21:20:30386semak imbas

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>
  • Tafsiran Semula Pembolehubah:
<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>

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!

Kenyataan:
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