2012-04-03 41 views
5

Tôi tin rằng trong C99, sửa đổi chuỗi ký tự là hành vi không xác định. Tôi không có một bản sao của tiêu chuẩn đó nhưng tôi có một dự thảo của C1X (n1570) trong đó nêu trong 6.4.5 đoạn 7:Có phải sửa đổi các chuỗi ký tự không xác định theo tiêu chuẩn C89 không?

Đó là không xác định liệu những mảng là khác biệt cung cấp các yếu tố của họ có các giá trị thích hợp. Nếu chương trình tìm cách sửa đổi một mảng như vậy, hành vi là không xác định.

Tôi đã tìm thấy một Stack Overflow question mà chạm về chủ đề này và có những nhận xét sau đây từ Jonathan Leffler:

Nguyên, tiêu chuẩn C89 (C90) đã không cấm sửa đổi literals vì đã có quá nhiều mã được viết trước tiêu chuẩn sẽ bị phá vỡ bởi nó.

Nhưng tôi cũng đã thấy rất nhiều cuộc thảo luận về loại của xâu và thực tế là họ đang char[N] và không const char[N]. Tôi thu thập rằng quyết định này đã được thực hiện để cơ thể lớn của mã hiện tại sẽ không phá vỡ.

Có ai có thể cho tôi câu trả lời dứt khoát không. Là chuỗi sửa đổi chữ UB trong C89?

+0

? Theo tôi biết, chuỗi ký tự là' const char * ' ... –

+6

@ H2CO3: Không phải trong C. –

+1

Tôi nhớ đã thấy một chương trình đáng kính [PDP-11] (https://en.wikipedia.org/wiki/PDP-11) sẽ hợp nhất các chuỗi giống nhau trong mã đối tượng để làm cho nó nhỏ hơn, do đó, sửa đổi chuỗi chữ là một ý tưởng tồi ngay cả trước khi C89. –

Trả lời

13

Có, chúng không thể sửa đổi được trong C89.

(C90, 6.1.4) "Nếu chương trình cố gắng để sửa đổi một chuỗi chữ của một trong hai hình thức, hành vi này là không xác định"

Ngay cả trong K & R 2nd edition, có dấu ngoặc kép về sự bất biến của chuỗi ký tự.

(K & R2, 5.5) "kết quả là không xác định nếu bạn cố gắng sửa đổi các nội dung chuỗi"

(K & R2, Phụ lục C) "Strings không còn thay đổi được, và vì vậy có thể đặt trong bộ nhớ chỉ đọc"

trong ANSI C89 Lý do, có một lời giải thích lý do tại sao nó là không thể thay đổi được:

(ANSI C89 Rationa le, 3.1.4) "Chuỗi ký tự được xác định là không thể sửa đổi được. Đặc điểm kỹ thuật này cho phép triển khai chia sẻ bản sao của chuỗi có văn bản giống hệt nhau, để đặt các chuỗi ký tự trong bộ nhớ chỉ đọc và thực hiện tối ưu hóa nhất định. "

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