Một lý do cho vấn đề này (thậm chí còn khó phát hiện hơn vấn đề với char* str = "some string"
- mà những người khác đã giải thích) là khi bạn đang sử dụng constexpr
.
constexpr char* str = "some string";
Có vẻ như nó sẽ hành xử tương tự const char* str
, và do đó sẽ không gây ra cảnh báo, như nó xảy ra trước đây char*
, nhưng nó thay vào đó hành xử như char* const str
.
Chi tiết
Con trỏ không đổi, và con trỏ đến một hằng. Sự khác biệt giữa const char* str
, và char* const str
có thể được giải thích như sau.
const char* str
: Khai báo str là con trỏ tới const char. Điều này có nghĩa là dữ liệu mà con trỏ này trỏ đến nó không đổi. Con trỏ có thể được sửa đổi, nhưng mọi nỗ lực sửa đổi dữ liệu sẽ gây ra lỗi biên dịch.
str++ ;
: GIÁ TRỊ . Chúng tôi đang sửa đổi con trỏ, và không phải dữ liệu được trỏ đến.
*str = 'a';
: THAM GIA . Chúng tôi đang cố gắng sửa đổi dữ liệu được trỏ đến.
char* const str
: Khai báo str là con trỏ const tới char. Điều này có nghĩa là điểm đó không đổi, nhưng dữ liệu được trỏ quá thì không. Con trỏ không thể được sửa đổi nhưng chúng ta có thể sửa đổi dữ liệu bằng cách sử dụng con trỏ.
str++ ;
: THAM GIA . Chúng tôi đang cố gắng sửa đổi biến con trỏ, đó là một hằng số.
*str = 'a';
: GIÁ TRỊ . Chúng tôi đang cố gắng sửa đổi dữ liệu được trỏ đến. Trong trường hợp của chúng tôi, điều này sẽ không gây ra lỗi biên dịch, nhưng sẽ gây ra lỗi thời gian chạy , vì chuỗi có thể sẽ đi vào phần chỉ đọc của tệp nhị phân được biên dịch. Tuyên bố này sẽ có ý nghĩa nếu chúng ta có bộ nhớ được phân bổ động, ví dụ. char* const str = new char[5];
.
const char* const str
: Khai báo str là con trỏ const cho const char. Trong trường hợp này, chúng tôi không thể sửa đổi con trỏ, cũng như dữ liệu được trỏ đến.
str++ ;
: THAM GIA . Chúng tôi đang cố gắng sửa đổi biến con trỏ, đó là một hằng số.
*str = 'a';
: THAM GIA . Chúng tôi đang cố gắng sửa đổi dữ liệu được trỏ bởi con trỏ này, đây cũng là hằng số.
Trong trường hợp của tôi, vấn đề là tôi đã mong đợi constexpr char* str
cư xử như const char* str
, và khôngchar* const str
, vì về mặt trực quan, nó có vẻ gần với cái trước hơn.
Ngoài ra, cảnh báo được tạo ra constexpr char* str = "some string"
là hơi khác với char* str = "some string"
.
- Trình biên dịch cảnh báo cho
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- Trình biên dịch cảnh báo cho
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
.
tiền boa
Bạn có thể sử dụng C gibberish converter Trình chuyển đổi tiếng Anh để chuyển đổi các C
khai báo thành các câu tiếng Anh dễ hiểu và ngược lại. Đây là một C
công cụ duy nhất và do đó sẽ không hỗ trợ những thứ (như constexpr) dành riêng cho C++
.
strncpy(str, func, 255)
thay vìstrcpy(str, func)
cho một bản sao an toàn hơn. Và sau đó đừng quên thêm '\ 0' vào cuối chuỗi vì strncpy không thêm nó.