Cでは、ポインターが同じ配列またはその配列の終わりを過ぎた1つの要素を参照する場合、演算と比較は明確に定義されていると言われています。次に、配列の最初の要素の前の1つはどうですか?私がそれを逆参照しない限り、それは大丈夫ですか?
与えられた
int a[10], *p;
p = a;
(1)書くことは合法--p
ですか?
(2)p-1
式を書くことは合法ですか?
(3)(2)が問題ない場合、それを主張できp-1 < a
ますか?
これには実際的な懸念があります。reverse()
で終わるC文字列を逆にする関数を考え'\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;
}
本当にコードでチェックする必要がありますか?
言語弁護士/実用的な観点からのあなたの考えと、そのような状況にどう対処するかを共有してください。