Tuyên bố từ chối trách nhiệm: Câu hỏi này nghiêm túc về mặt học thuật. Ví dụ tôi sắp đưa ra có lẽ là kiểu xấu.Dereferencing con trỏ đến dữ liệu tĩnh ngoài phạm vi trong C
Giả sử trong CI viết một chương trình con của mẫu này:
char *foo(int x)
{
static char bar[9];
if(x == 0)
strcpy(bar, "zero");
else
strcpy(bar, "not zero"),
return bar;
}
Sau đó, ở đâu đó, tôi sử dụng foo
như sau:
printf("%i is %s\n", 5, foo(5));
mô hình tinh thần của tôi về con trỏ và các biến tĩnh dự đoán rằng, trong thực hành, đầu ra của printf này sẽ là
5 không phải là số không
... nhưng điều này thực sự được yêu cầu theo tiêu chuẩn C hay tôi ở lãnh thổ quỷ mũi?
Để làm cho mọi việc thậm chí tệ hơn, những gì về một cái gì đó giống như
strcpy(foo(5), "five");
mô hình tinh thần của tôi nói rằng nên "tác phẩm" này, trừ khi đó là một cách rõ ràng bất hợp pháp, mặc dù nó hơi vô nghĩa vì nó không ảnh hưởng đến đầu ra của foo
. Nhưng một lần nữa, điều này thực sự được định nghĩa theo tiêu chuẩn?
Ví dụ cuối cùng của bạn là "hợp pháp", nhưng tôi không chắc đó là "đạo đức". Cũng có thể có một đồng bằng cũ toàn cầu nếu mọi người có thể sửa đổi nó. (Và hãy thận trọng với chủ đề.) – Mat