Trong C++ 11 chuẩn nó quy định rõ ràng rằng .c_str()
(cũng như mới .data()
) phải trả lại con trỏ đến bộ đệm bên trong được sử dụng bởi std::string
.
Bất kỳ sửa đổi của std :: string sau khi có con trỏ qua .c_str()
thể kết quả trong nói char *
trở lại trở thành không hợp lệ (có nghĩa là - nếu std::string
nội bộ đã phải tái phân bổ không gian).
Trong việc thực hiện các tiêu chuẩn C++ trước đó được phép trả lại bất kỳ thứ gì. Nhưng như là tiêu chuẩn không yêu cầu người sử dụng để deallocate kết quả, tôi đã không bao giờ nhìn thấy bất kỳ thực hiện trả lại bất cứ điều gì mới được phân bổ. Ít nhất GNU gcc và chuỗi STL của MSVC++ là mảng char được kết thúc bằng 0, được trả về bởi c_str()
.
Vì vậy, nó an toàn để giả định (với bình thường cho C++ thận trọng) rằng trong bất kỳ phiên bản của C++ trong bất kỳ nó thực hiện .c_str()
sẽ trả về bộ đệm bên trong.
Nói cách khác - bạn sẽ không bao giờ giữ giá trị .c_str()
trừ khi bạn chắc chắn 100% nó sẽ không thay đổi kích thước của nó bất kỳ lúc nào trong tương lai (trừ khi đó là const
).
P.S. BTW, bạn không bao giờ nên làm char* pointer=(char*)str.c_str();
. Đó là const char *
và bạn không được sửa đổi nội dung, một phần vì ở trên - bạn có thể ghi đè lên bộ nhớ của một số đối tượng khác hoặc làm hỏng trạng thái nội bộ của std::string
, trong trường hợp triển khai thực hiện điều gì đó lạ mắt, như lập chỉ mục các ký tự cho nhanh hơn .find()
nhìn thấy điều đó, nhưng này - đó là một đóng gói!)
Nguồn
2013-07-01 11:18:16
* Tại sao * bạn có muốn địa chỉ này không? Bạn đang cố gắng làm gì với chuỗi? – trojanfoe
Bạn đang tìm kiếm câu trả lời C++ 11 hoặc C++ 03? Câu trả lời đúng tùy thuộc vào điều này. Nếu không có đặc tả kỹ hơn, tôi sẽ tiếp tục giả sử C++ 11. –
Có thể bạn có thể trả lời các câu hỏi để chúng tôi có thể trả lời câu hỏi của bạn tốt hơn? Bạn đã ở đây vài phút trước. –