Penunjuk Kosong dalam C dan C : Menyingkap Perbezaan
Apabila bekerja dengan penunjuk, terdapat percanggahan yang ketara antara sintaks C dan C, terutamanya berkenaan dengan penunjuk tidak sah. Dalam C, penetapan penuding kosong kepada penuding jenis lain dibenarkan, manakala dalam C ia memerlukan hantaran yang jelas.
Pertimbangkan contoh berikut:
<code class="c">int* p = malloc(sizeof(int));</code>
Kod ini menyusun berjaya dalam C kerana malloc mengembalikan penuding kosong, yang boleh ditetapkan dengan selamat kepada penuding integer dalam C. Walau bagaimanapun, percubaan yang sama dalam C akan mengakibatkan ralat penyusunan.
Walau bagaimanapun, dalam konteks yang berbeza, kod berikut disusun dalam kedua-dua C dan C tanpa isu:
<code class="c">void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; }</code>
Percanggahan ini berpunca daripada penukaran penunjuk tersirat dan eksplisit dalam C dan C, masing-masing. Dalam C, kedua-dua penukaran adalah tersirat, membolehkan peralihan mudah antara jenis penunjuk. Walau bagaimanapun, dalam C , sementara penukaran daripada jenis penuding kepada penuding kosong kekal tersirat, penukaran dalam arah bertentangan memerlukan hantaran yang jelas.
Pembezaan ini diserlahkan dalam manual rujukan bahasa C (K&R2), yang secara eksplisit menyatakan bahawa hanya penukaran daripada penuding objek kepada penuding kosong disokong tanpa kehilangan maklumat.
Sebagai perbandingan, piawaian C menetapkan peraturan yang lebih ketat, mewajibkan hantaran eksplisit apabila menukar daripada penuding kosong kepada mana-mana jenis penuding lain , dengan itu memastikan keselamatan jenis dan mencegah kemungkinan ralat penunjuk.
Atas ialah kandungan terperinci Penunjuk Void dalam C dan C : Mengapa Pemutus Penting?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!