Người ta nói trong C rằng khi các con trỏ đề cập đến cùng một mảng hoặc một phần tử vượt quá cuối của mảng đó thì các số liệu và so sánh được xác định rõ. Sau đó, những gì về một trước phần tử đầu tiên của mảng? Có ổn không miễn là tôi không tham gia nó?
Được
int a[10], *p;
p = a;
(1) Nó có hợp pháp để viết --p
không?
(2) Có hợp pháp để viết p-1
trong một biểu thức không?
(3) Nếu (2) không sao, tôi có thể khẳng định điều đó p-1 < a
không?
Có một số mối quan tâm thực tế cho việc này. Hãy xem xét một reverse()
hàm đảo ngược chuỗi C kết thúc bằng '\0'
.
#include <stdio.h>
void reverse(char *p)
{
char *b, t;
b = p;
while (*p != '\0')
p++;
if (p == b) /* Do I really need */
return; /* these two lines? */
for (p--; b < p; b++, p--)
t = *b, *b = *p, *p = t;
}
int main(void)
{
char a[] = "Hello";
reverse(a);
printf("%s\n", a);
return 0;
}
Tôi có thực sự cần phải kiểm tra mã không?
Vui lòng chia sẻ ý tưởng của bạn từ ngôn ngữ-luật sư / quan điểm thực tế và cách bạn đối phó với các tình huống như vậy.