Alasan untuk masalah ini (yang bahkan lebih sulit untuk dideteksi daripada masalah dengan char* str = "some string"
- yang orang lain telah jelaskan) adalah ketika Anda menggunakan constexpr
.
constexpr char* str = "some string";
Tampaknya itu akan berperilaku mirip dengan const char* str
, dan karenanya tidak akan menyebabkan peringatan, seperti yang terjadi sebelumnya char*
, tetapi sebaliknya berperilaku sebagai char* const str
.
Detail
Pointer konstan, dan pointer ke konstanta. Perbedaannya antara const char* str
, dan char* const str
dapat dijelaskan sebagai berikut.
const char* str
: Nyatakan str untuk menjadi pointer ke const const. Ini berarti bahwa data yang menunjuk pointer ini konstan. Pointer dapat dimodifikasi, tetapi setiap upaya untuk mengubah data akan menimbulkan kesalahan kompilasi.
str++ ;
: VALID . Kami memodifikasi pointer, dan bukan data yang diarahkan.
*str = 'a';
: INVALID . Kami mencoba untuk memodifikasi data yang ditunjuk.
char* const str
: Nyatakan str untuk menjadi pointer const ke char. Ini berarti bahwa titik sekarang konstan, tetapi data yang ditunjukkan juga tidak. Pointer tidak dapat dimodifikasi tetapi kita dapat memodifikasi data menggunakan pointer.
str++ ;
: INVALID . Kami mencoba untuk memodifikasi variabel pointer, yang merupakan konstanta.
*str = 'a';
: VALID . Kami mencoba untuk memodifikasi data yang ditunjuk. Dalam kasus kami ini tidak akan menyebabkan kesalahan kompilasi, tetapi akan menyebabkan kesalahan runtime , karena string kemungkinan besar akan masuk ke bagian read only dari biner yang dikompilasi. Pernyataan ini akan masuk akal jika kita telah mengalokasikan memori secara dinamis, misalnya. char* const str = new char[5];
.
const char* const str
: Deklarasikan str untuk menjadi pointer const ke char const. Dalam hal ini kita tidak dapat memodifikasi pointer, atau data yang diarahkan.
str++ ;
: INVALID . Kami mencoba untuk memodifikasi variabel pointer, yang merupakan konstanta.
*str = 'a';
: INVALID . Kami mencoba untuk memodifikasi data yang ditunjukkan oleh pointer ini, yang juga konstan.
Dalam kasus saya masalahnya adalah bahwa saya mengharapkan constexpr char* str
untuk berperilaku const char* str
, dan tidak char* const str
, karena secara visual tampaknya lebih dekat dengan yang pertama.
Juga, peringatan yang dihasilkan constexpr char* str = "some string"
sedikit berbeda dari char* str = "some string"
.
- Peringatan kompiler untuk
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- Peringatan compiler untuk
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
Tip
Anda dapat menggunakan Konversi Bahasa Inggris ↔ Bahasa Inggris untuk mengonversi C
deklarasi ke pernyataan bahasa Inggris yang mudah dimengerti, dan sebaliknya. Ini adalah satu- C
satunya alat, dan karenanya tidak akan mendukung hal-hal (seperti constexpr) yang eksklusif untuk C++
.
strncpy(str, func, 255)
alih-alihstrcpy(str, func)
untuk salinan yang lebih aman. Dan jangan lupa untuk menambahkan '\ 0' di akhir string karena strncpy tidak menambahkannya.