Rumah > pembangunan bahagian belakang > C++ > Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?

Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?

Linda Hamilton
Lepaskan: 2024-12-25 16:46:18
asal
193 orang telah melayarinya

Why is Direct String Literal to `char*` Conversion Allowed in C but Deprecated in C  ?

Mengapa Penukaran Huruf Rentetan kepada 'char*' Dibenarkan dalam C tetapi Ditamatkan dalam C

Dalam C, adalah sah untuk menetapkan rentetan literal terus ke penunjuk 'char*', seperti yang ditunjukkan di bawah:

char* p = "abc";
Salin selepas log masuk

Walau bagaimanapun, dalam C 11 dan seterusnya, penukaran tersirat ini telah dialih keluar kerana potensinya untuk membawa kepada tingkah laku yang tidak ditentukan jika rentetan literal diubah suai. Piawaian C secara eksplisit menyatakan dalam § C.1.1 bahawa contoh di atas kini tidak sah.

Untuk menangani isu ini, C membenarkan cast eksplisit untuk menukar literal rentetan kepada penunjuk 'char*'. Pelakon ini jelas menunjukkan bahawa pengaturcara memahami potensi risiko dan menerima tanggungjawab atas sebarang akibat yang mungkin timbul.

char* p = (char*)"abc"; // Valid with explicit cast
Salin selepas log masuk

Pelakon eksplisit dalam C mempunyai dua tujuan:

  1. Ia menyekat amaran pengkompil yang sebaliknya akan dijana disebabkan oleh penukaran tersirat yang ditamatkan.
  2. Ia memaksa pengaturcara untuk mengakui potensi kelakuan tidak ditentukan jika rentetan literal diubah suai.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa walaupun dengan hantaran eksplisit, menetapkan rentetan literal kepada penunjuk 'char' masih tidak dianggap sebagai amalan terbaik dalam C . Pendekatan yang lebih selamat adalah dengan menggunakan penunjuk 'const char', yang secara jelas menunjukkan bahawa literal rentetan tidak boleh diubah suai:

char const *p = "abc"; // Valid and safe
Salin selepas log masuk

Ini menjamin bahawa literal rentetan akan kekal tidak diubah suai, menghalang potensi tidak ditentukan tingkah laku.

Dalam C, penukaran tersirat daripada rentetan literal kepada penunjuk 'char*' kekal sah kerana jumlah yang besar kod warisan yang bergantung pada tingkah laku ini. Mengalih keluar penukaran tersirat dalam C akan memecahkan sejumlah besar program sedia ada.

Atas ialah kandungan terperinci Mengapakah Rentetan Langsung Literal kepada `char*` Penukaran Dibenarkan dalam C tetapi Ditamatkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan