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:
<code class="cpp">fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
<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!