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?
? Theo tôi biết, chuỗi ký tự là' const char * ' ... –
@ H2CO3: Không phải trong C. –
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. –