2013-03-19 35 views

Trả lời

14

Loại chuỗi ký tự "Hello" là "mảng 6 constchar".

Chữ thường chuỗi và chuỗi ký tự UTF-8 cũng được gọi là chuỗi ký tự hẹp. Một chuỗi hẹp theo nghĩa đen có kiểu “mảng của nconst char”, nơi n là kích thước của chuỗi [...]

Nó có thể, tuy nhiên, được chuyển đổi sang một const char* bởi mảng-to chuyển đổi con trỏ. Kết quả chuyển đổi từ mảng sang con trỏ trong một con trỏ đến phần tử đầu tiên của mảng.

+0

Điều này có thể giải thích tại sao mã này hiển thị cảnh báo 'C4172 địa chỉ trả về biến cục bộ hoặc tạm thời'cho hàm này' const char * const & f() {return "hello"; } 'trong VS2010. Bạn có đồng ý với điều này ? – Belloc

+1

@ user1042389 Con trỏ kết quả từ việc chuyển đổi mảng thành con trỏ là một đối tượng tạm thời. Bạn đang trả về một tham chiếu đến đối tượng đó, vì vậy tham chiếu đó vẫn còn lơ lửng. –

+0

Tạm thời ở đâu? "hello" tồn tại trong bộ nhớ tĩnh! – Belloc

4

Tiêu chuẩn xác định nó là "mảng của n const char", do đó, const char[n] (n là kích thước của chuỗi, bao gồm cả việc kết thúc byte NUL).

Mục 7, § 2.14.15:

Một chuỗi hẹp theo nghĩa đen có kiểu “mảng của n const char”, trong đó n là kích thước của chuỗi theo quy định dưới đây, và có thời gian lưu trữ tĩnh.

Các vấn đề liên quan