sprintf打印或返回IP地址的麻烦

时间:2015-04-12 20:02:54

标签: c

以下是我现在尝试设置的代码,我无法弄清楚为什么这不起作用。我在输入中创建了一个带有sockaddr_in的简单函数。我希望它返回(不打印)包含与sockaddr_in关联的IP的char *。

char* get_ip_from_sockaddr(struct sockaddr_in client_addr)
{
int a = (client_addr.sin_addr.s_addr&0xFF);
int b = (client_addr.sin_addr.s_addr&0xFF00)>>8;
int c = (client_addr.sin_addr.s_addr&0xFF0000)>>16;
int d = (client_addr.sin_addr.s_addr&0xFF000000)>>24;

char* ip[24];
int n = sprintf(ip, "%d.%d.%d.%d", a, b, c, d);
printf("%s", ip); // The IP is correctly printed
return ip;
}

我像这样检索ip:

char* ip = get_ip_from_sockaddr(client_addr);
printf("IP CLIENT: %s\n", ip);

以下是我的程序的输出:

127.0.0.1IP CLIENT: �����

我不明白为什么在函数内部正确打印,但是当我从函数中检索时,不打印IP。

1 个答案:

答案 0 :(得分:3)

您已将ip声明为指针的数组,而不是char数组。但更重要的是,它是一个存在于堆栈中的本地数组,当你从函数返回时,内存被释放并且可以被任何东西覆盖。

如果您将ip声明为

static char ip[24];

,你应该安全。有一点需要注意:对该函数的所有调用都将使用相同的内存作为ip字符串,因此下一次调用将覆盖一次调用的结果。