|
> char ip_addr[15];
>
> ip_addr = change_addr(addr);
"202.224.197.114" は最後につく '\0' を含めて 16バイトです。
ip_addr は配列変数ですが、式の中ではポインタの値に変換されるので、
代入演算子の左辺に置くことは出来ません。
さて、char *change_addr(unsigned long ipaddr) ですが、ポインタを返す場合、
ポインタの指す実体をどこに置くかが非常に問題になります。
このままだと、関数 change_addr の内部で、static な領域を用意しておくか、
あるいは、malloc で動的に確保するかでしょう。
それよりは、char *change_addr(char *str, unsigned long ipaddr) として、
呼び出し元が領域を渡すほうが良いのではないでしょうか。
char *change_addr(char *str, unsigned long ipaddr)
{
sprintf(str, "%d.%d.%d.%d", p[3], p[2], p[1], p[0]);
return str;
}
これは、リトルエンディアンの CPU を仮定しています。ビッグエンディアンだと、
3〜0 が逆になります。どちらにも対応できるようにするなら、次のようになります。
char *change_addr(char *s, unsigned long ipaddr)
{
static long a = 1;
unsigned char *p = (void *)&ipaddr;
if (*(char *)&a)
sprintf(s, "%d.%d.%d.%d", p[3], p[2], p[1], p[0]);
else
sprintf(s, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
return s;
}
|