以下是我现在尝试设置的代码,我无法弄清楚为什么这不起作用。我在输入中创建了一个带有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。
答案 0 :(得分:3)
您已将ip声明为指针的数组,而不是char数组。但更重要的是,它是一个存在于堆栈中的本地数组,当你从函数返回时,内存被释放并且可以被任何东西覆盖。
如果您将ip声明为
static char ip[24];
,你应该安全。有一点需要注意:对该函数的所有调用都将使用相同的内存作为ip字符串,因此下一次调用将覆盖一次调用的结果。