Như những người khác đã đề cập, nội dung của chuỗi không đổi được lưu trữ trong bộ nhớ chỉ đọc được xác định bởi hoạt động kiến trúc hệ thống, trình biên dịch và chip.
Chính xác hơn, tiêu chuẩn C chỉ định rằng các chuỗi được trích dẫn được coi là có loại "const char []" (hoặc các từ với hiệu ứng đó, tôi không có sẵn tiêu chuẩn).
Bất kỳ mã nào cố gắng sửa đổi nội dung của chuỗi như vậy đều gọi hành vi không xác định. Điều đó có nghĩa rằng bất cứ điều gì nghĩa đen có thể xảy ra tại thời điểm đó, và các nhà cung cấp của trình biên dịch thậm chí không cần thiết để ghi lại những gì có thể xảy ra.
Trong thực tế, điều này có nghĩa là chương trình C hoặc C++ muốn di chuyển phải tránh thay đổi các chuỗi không đổi.
Nói chung, trình biên dịch sẽ không cho phép bạn sửa đổi nội dung của biến "const", vì vậy bạn có thể xem "const" có nghĩa là "chỉ đọc" trong hầu hết các trường hợp. Thật không may, có một ngoại lệ đặc biệt cho char * và const char *, phần lớn vì lý do lịch sử. Điều đó có nghĩa là mã như sau:
char *x = "Hello, World";
*x = 'h';
sẽ biên dịch mà không có lỗi hoặc cảnh báo, mặc dù nó gọi hành vi không xác định.
Nguồn
2009-11-10 01:19:26
Bạn có một tài liệu tham khảo? Tôi nghĩ bạn có thể có nghĩa là: const char * s = "hello world". –
Không rõ là tất cả kiến trúc bộ vi xử lý đều hỗ trợ bộ nhớ được bảo vệ. – jldupont
@James Black: OP rõ ràng là nói về chuỗi chữ "hello world", mà thực sự có thể được lưu trữ trong bộ nhớ chỉ đọc, bất kể con trỏ được khai báo như thế nào. – AnT