Tôi nghĩ gần nhất bạn có thể đến là để khởi tạo một đồng bằng char[]
(không phải là một char * []) với một chữ:
char foo[] = "foo";
Đó vẫn sẽ thực hiện một bản sao tại một số điểm mặc dù.
Cách duy nhất khác xung quanh đó là sử dụng các cuộc gọi cấp hệ thống để đánh dấu trang mà một chuỗi ký tự nằm ở dạng có thể ghi. Tại thời điểm đó bạn không thực sự nói về C hoặc C++, bạn đang thực sự nói về Windows (hoặc bất cứ hệ thống nào bạn đang chạy). Nó có thể có thể trên hầu hết các hệ thống (trừ khi dữ liệu thực sự trong ROM, có thể là trường hợp trên một hệ thống nhúng chẳng hạn), nhưng tôi chắc chắn không biết chi tiết.
Oh, và đừng quên rằng trong ví dụ của bạn:
char* foo[] = {
"foo",
"foo"
};
Kể từ tiêu chuẩn (C99 6.4.5/6 "literals String") nói:
Đó là không xác định liệu các mảng này khác biệt với điều kiện các phần tử của chúng có các giá trị thích hợp.
Không chắc chắn về việc liệu 2 con trỏ trong mảng đó sẽ trỏ đến cùng một đối tượng hoặc riêng biệt. Gần như tất cả các trình biên dịch sẽ có những con trỏ trỏ đến cùng một đối tượng ở cùng một địa chỉ, nhưng chúng không phải và một số tình huống phức tạp hơn của các con trỏ tới chuỗi ký tự chuỗi có thể có trình biên dịch đến với 2 chuỗi giống hệt nhau.
Bạn thậm chí có thể có một kịch bản mà một chuỗi chữ tồn tại 'bên' khác:
char* p1 = "some string";
char* p2 = "string";
p2
cũng có thể được chỉ ở phần cuối đuôi của chuỗi được trỏ đến bởi p1
.
Vì vậy, nếu bạn bắt đầu thay đổi chuỗi ký tự bằng một số hack bạn có thể thực hiện trên hệ thống, bạn có thể kết thúc việc sửa đổi một số chuỗi 'khác' một cách vô tình. Đó là một trong những điều mà hành vi không xác định có thể mang lại.
Nguồn
2010-06-16 16:30:14
Không, theo tiêu chuẩn sửa đổi một chuỗi chữ gợi lên hành vi không xác định. Bản thân dữ liệu là 'const', ngay cả khi bạn có con trỏ không phải là 'const'. Nếu bạn làm điều này bạn có nguy cơ gặp vấn đề từ chạy để chạy, hoặc khi bạn thay đổi hoặc thậm chí vá trình biên dịch của bạn. –
Việc thay đổi chuỗi ** chữ ** sẽ không có ý nghĩa. Có lẽ nó rõ ràng hơn với int: làm thế nào để làm cho '5 = 7' biên dịch? – fredoverflow
Anne, đây không phải là điều bạn nên làm, nhưng có thể thực hành, dựa vào tiêu chuẩn C++ nói. Tôi đã viết một bài báo giải thích cách làm điều này trong các hệ thống giống UNIX có giao diện bảo vệ bộ nhớ được tiếp xúc với các chương trình không gian người dùng, [kiểm tra nó ở đây] (http://lazarenko.me/2013/05/01/how-constant -is-a-constant /). –