このif (str)
テストにより、null ポインターの逆参照とクラッシュを防ぐことができます。
この定義でchar *end = str;
は、変数end
、文字ポインターを定義し、格納されている値str
(指す文字列の最初の文字のアドレス) で初期化しstr
ます。
コードの残りの部分は、文字列の長さを決定し、文字列の中央に向かって、両端から文字のペアを交換するように調整します。技術的には、空の文字列 (文字列の末尾にある null バイトを指すポインター) が渡された場合、元のコードは安全ではありません。これは、指してend
いるバイトの前に 1 バイトに減少するためです。str
ただし、文字列の先頭の 1 バイト前のアドレスが有効であるという保証はありません。文字列がメモリ ページの最初のバイトを指している可能性があり、前のページはマップされていないため、クラッシュやその他の問題が発生します。
strlen()
文字列の長さを決定するために使用することをお勧めします。
void reverse(char *str)
{
if (str != 0 && *str != '\0') // Non-null pointer; non-empty string
{
char *end = str + strlen(str) - 1;
while (str < end)
{
char tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}