void Penunjuk: Mendedahkan Jurang Antara C dan C
Apabila bercakap mengenai penunjuk batal, C dan C mempamerkan gelagat yang berbeza. Isu ini berkisar tentang keizinan untuk memberikan nilai pulangan batal* kepada penunjuk bukan batal.
Dalam C, tugasan tersebut dibenarkan, seperti yang ditunjukkan oleh kod berikut yang menyusun tanpa ralat:
<code class="c">int* p = malloc(sizeof(int));</code>
Walau bagaimanapun, dalam C , kod yang sama gagal untuk disusun, menyerlahkan penyemakan jenis yang lebih ketat dalam C . Percanggahan ini berpunca daripada perbezaan cara penunjuk tidak sah dikendalikan.
Walaupun C membenarkan penukaran tersirat antara kekosongan dan mana-mana jenis penunjuk lain, C menyekat kebebasan ini. Dalam C , penukaran daripada void kepada jenis penuding tertentu memerlukan hantaran yang jelas. Jadi, hantaran diperlukan untuk kod berikut dihimpun dalam C :
<code class="c++">int* p = (int*) malloc(sizeof(int));</code>
Walaupun terdapat perbezaan ini, C membenarkan penukaran tersirat daripada penuding bukan kosong kepada batal*. Ciri ini jelas dalam kod berikut:
<code class="cpp">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
Kod ini disusun tanpa isu dalam kedua-dua C dan C. Sebabnya terletak pada fleksibiliti yang wujud pada kekosongan dan sifat penunjuk. Mana-mana penunjuk objek boleh ditukar dengan selamat kepada batal tanpa kehilangan maklumat. Apabila kekosongan* ditukar kembali kepada jenis penuding asalnya, penuding tepat dipulihkan. Ini digambarkan oleh petikan daripada K&R2:
"Mana-mana penunjuk ke objek boleh ditukar kepada taip void * tanpa kehilangan maklumat. Jika keputusan ditukar kembali kepada jenis penunjuk asal, penuding asal akan dipulihkan ."
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menetapkan `kosong*` kepada Penunjuk Bukan Kosong dalam C , Tetapi Saya Boleh dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!