>>455
更に、*str は再帰したルーチンでは触らないので c1 へ退避は不要。

char *reverse(char *str)
{
 char *p;
 char c2;

 if (strlen(str) < 2) return str;
 p = str + strlen(str) - 1;
 c2 = *p;
 *p = '\0';
 reverse(str + 1);
 *p = *str;
 *str = c2;
 return str;
}