Các đoạn mã sau biên dịch và chạy mà không có lỗi và với sản lượng dự kiến:Return C-string địa phương cho chức năng với C++ chuỗi giá trị trả về
#include <string>
#include <iostream>
using namespace std;
string getString()
{
char s[] = "Hello world!";
return s;
}
int main()
{
cout << getString() << endl;
}
Câu hỏi của tôi là, sẽ này luôn làm việc? Thông thường nếu bạn trả về một chuỗi C đã được khai báo cục bộ, bạn có thể chạy vào một số hành vi không xác định, nhưng trong trường hợp này vẫn còn là một vấn đề vì nó được chạy qua hàm tạo chuỗi và (có lẽ) được sao chép vào bộ nhớ động?
Một trong những lý do chính 'std :: string' được thêm vào thư viện chuẩn - nó có thể được sử dụng như một kiểu được nhúng như' int' và 'double', do đó, có vâng trả lại' std :: string' bởi giá trị. – Slava
Bạn có biết rằng chuỗi rác có thời gian lưu trữ tĩnh: [cpp-ref] (http://en.cppreference.com/w/cpp/language/string_literal). Vì vậy, nếu chuỗi c của bạn chỉ trỏ đến một chuỗi literral như trong 'const char * s =" Hello World "' bạn có thể trả lại nó một cách an toàn từ hàm của bạn, vì s là một con trỏ trỏ tới một đối tượng có thời gian lưu trữ tĩnh. Đây là lý do tại sao 'std :: except :: what()' hoặc 'type_info :: name()' trả về một c-string – Oliv
@Oliv đó là một thực tế gọn gàng nhưng đây chỉ là một ví dụ, trong chương trình thực sự của tôi chuỗi C là được tạo tại thời gian chạy –