Mengapa Penukaran daripada String Literal kepada 'char*' adalah Sah dalam C tetapi Tidak Sah dalam C
Dalam § C.1.1 C 11 Standard (ISO/IEC 14882:2011), tugasan char* p = "abc" diisytiharkan tidak sah. Walau bagaimanapun, penukaran ini masih sah dalam C. Mengapakah ini berlaku?
Penukaran Tersirat Ditamatkan dalam C
Dalam versi C sehingga C 03, penukaran daripada rentetan literal kepada 'char*' adalah sah, walaupun tidak digunakan lagi. Tersurat rentetan harus dianggap sebagai 'char const *', kerana kandungannya tidak boleh diubah suai tanpa gelagat yang tidak ditentukan.
Penukaran Eksplisit Kekal Sah
Walaupun penukaran tersirat telah ditamatkan dalam C 11, penukaran eksplisit kekal sah. Untuk membuat kod dikompilasi, cast boleh ditambah: char* p = (char*)"abc".
Kelemahan Casting
Walau bagaimanapun, penukaran eksplisit ini tidak "membetulkan" kod. Ia hanya membenarkan pengkompil menerima tugasan. Isu yang berpotensi dengan mengubah suai literal rentetan masih wujud.
Penyelesaian: Gunakan Jenis Betul
Cara yang betul untuk mengendalikan literal rentetan ialah menggunakan jenis yang betul, ' char const *': char const *p = "abc". Pendekatan ini sah dan selamat dalam kedua-dua C dan C .
Justifikasi dalam C
Penukaran kekal sah dalam C kerana sejumlah besar kod sedia ada bergantung padanya . Pelanggaran kod ini tanpa amaran yang sewajarnya dianggap tidak diingini oleh jawatankuasa standard.
Atas ialah kandungan terperinci Mengapakah Penukaran Rentetan Huruf kepada `char*` Sah dalam C tetapi Tidak Sah dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!