Chuẩn chỉ cho biết rằng chuỗi ký tự có thời lượng lưu trữ là tĩnh, có nghĩa là thời gian tồn tại của biến cho đến khi chương trình kết thúc và được khởi tạo khi chương trình bắt đầu. Các phần có liên quan trong C11 draft standard là 6.4.5
đoạn :
[...] Chuỗi ký tự multibyte sau đó được sử dụng để khởi tạo một mảng thời hạn lưu trữ tĩnh và thời gian chỉ đủ để chứa các chuỗi. [...]
Nó có thể ở trong bộ nhớ chỉ đọc và có thể là nhưng thực hiện được xác định. Nó không cần phải được giải thoát, chỉ bộ nhớ được cấp động qua số malloc
cần có cuộc gọi tiếp theo tới free
.
Nếu tôi sử dụng chương trình này:
int main()
{
const char * ptr = "String one";
return 0;
}
và chúng tôi xây dựng nó với gcc
và sau đó sử dụng objdump
:
objdump -s -j .rodata a.out
Chúng tôi sẽ thấy rằng trong trường hợp này nó thực sự được lưu trữ trong chỉ đọc phần dữ liệu:
Contents of section .rodata:
400580 01000200 53747269 6e67206f 6e6500 ....String one.
Bạn có thể tự chạy nó here
Nguồn
2013-08-01 20:09:03
Chuỗi ký tự là phân bổ tĩnh. Họ không cần phải được giải thoát. –
Kiểm tra câu hỏi này: [Tôi có nên miễn phí char * được khởi tạo bằng chuỗi ký tự không?] (Http://stackoverflow.com/questions/9504588/should-i-free-char-initialized-using-string-literals) – sidyll
Tại sao nó nên được giải phóng? con trỏ chỉ trỏ đến một chuỗi ký tự khác và được giải thích trong câu trả lời được chấp nhận, các chuỗi ký tự chuỗi có thời gian lưu trữ tĩnh để chúng không được giải phóng. – 0decimal0