Điều này thường là không phải an toàn, bất kể chuỗi chuỗi nội bộ có được lưu trữ trong bộ nhớ liên tục hay không. Có thể có nhiều chi tiết triển khai khác liên quan đến cách chuỗi được kiểm soát được lưu trữ bởi đối tượng std::string
, bên cạnh tính liên tục.
Một vấn đề thực tế thực tế với điều đó có thể là như sau. Trình tự được kiểm soát của std::string
không bắt buộc phải được lưu trữ dưới dạng chuỗi không bị chấm dứt. Tuy nhiên, trong thực tế, việc triển khai nhiều (nhiều nhất) chọn quá cỡ bộ đệm bên trong 1 và lưu trữ chuỗi dưới dạng chuỗi đã kết thúc bằng 0 vì nó đơn giản hóa việc thực hiện phương thức c_str()
: chỉ cần trả về con trỏ tới bộ đệm trong và bạn làm xong.
Mã bạn trích dẫn trong câu hỏi của bạn không thực hiện bất kỳ nỗ lực nào để không chấm dứt dữ liệu được sao chép vào bộ đệm trong. Rất có thể nó chỉ đơn giản là không biết liệu chấm dứt 0 là cần thiết trong việc thực hiện này của std::string
. Rất có thể nó dựa vào bộ đệm bên trong được lấp đầy bằng số không sau khi gọi tới resize
, vì vậy ký tự bổ sung được phân bổ cho zero-terminator bằng cách thực hiện thuận tiện được đặt trước là 0. Tất cả điều này là chi tiết thực hiện, có nghĩa là kỹ thuật này phụ thuộc vào một số giả định khá mỏng manh.
Nói cách khác, trong một số triển khai, bạn có thể phải sử dụng strcpy
, không phải memcpy
để buộc dữ liệu vào chuỗi được kiểm soát như vậy. Trong khi ở một số triển khai khác, bạn phải sử dụng memcpy
chứ không phải strcpy
.
Việc sử dụng & s [0] là OK, memcpy() được cho là ít hơn. Tại sao không chỉ đơn giản là làm một bài tập, hoặc sử dụng hàm thành viên assign() của chuỗi? –
@Neil Butterworth, đó là những gì tôi đang tự hỏi mình khi xem mã này ...;) – paxos1977
Khi bạn có được lập trình kinh nghiệm trong C++, bạn sẽ kiềm chế ngày càng nhiều hơn từ việc sử dụng 'memset' và' memcpy' và tìm hiểu Lý luận. Đây là một để thêm vào kinh nghiệm của bạn. –