2013-08-01 54 views
12

Mã sau trỏ đến ký tự đầu tiên trong mảng char char có sẵn trong bộ nhớ chỉ đọc. Không biết có đúng ?:Con trỏ tới Const Char

const char * ptr = "String one"; 

Bây giờ khi ptr bắt đầu để trỏ vào một bộ nhớ vị trí:

ptr = "String two"; 

gì xảy ra với người đầu tiên char mảng? Vị trí bộ nhớ đó có được giải phóng khi thực hiện kết thúc không?

+2

Chuỗi ký tự là phân bổ tĩnh. Họ không cần phải được giải thoát. –

+0

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

+1

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

Trả lời

7

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 standard6.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

+0

Vì vậy, nó sẽ tự động bị xóa khỏi bộ nhớ khi chương trình được đóng lại? – 2013Asker

+0

@ 2013Asker Có, khi chương trình của bạn thoát, nó sẽ phát hành tài nguyên cho hệ thống. –

+4

Trên thực thi được lưu trữ điển hình, một chuỗi ký tự có thể nằm trong bộ nhớ được hệ điều hành đánh dấu là chỉ đọc, không phải trong ROM vật lý và tất cả bộ nhớ của chương trình sẽ gần như chắc chắn được phát hành khi chương trình kết thúc. Trên thực hiện độc lập, nó có thể là một câu chuyện khác; một hệ thống rất thấp có thể chạy chỉ một chương trình, có mã và dữ liệu tĩnh được lưu trữ trong ROM mà không bao giờ bị xóa. –

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