我试图通过getaddrinfo函数传递一串可变长度,我的代码基本上是:
char *fun(char *ip) {
struct addrinfo* res;
int error;
// resolve the domain name into a list of addresses
error = getaddrinfo(ip, NULL, NULL, &res);
if (error != 0) {
if (error == EAI_SYSTEM) {
perror("getaddrinfo");
} else {
fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
}
exit(EXIT_FAILURE);
}
// go over returned result and do inverse lookup
char hostname[NI_MAXHOST];
error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0);
if (error != 0) {
fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error));
}
// here I use a pointer in order to pass the string without gcc complain about passing a local var
char *visname = strdup(hostname);
/* if I uncomment the below then string is passed correctly */
// printf("%s\n", hostname);
freeaddrinfo(res);
return visname;
}
int main() {
...
for (int n=0; n<ips; n++) {
printf("%s\n", fun(ip[n]) );
}
return 0;
}
现在这就是事情:
我非常确定我可以将字符串作为参数传递给fun函数然后返回它,但由于它的长度可变,这意味着我需要每次都释放它时间。
所以我的偏好是somwhow通过函数传递主机名然后我将在main ...中处理它...
答案 0 :(得分:0)
不需要在功能之外释放它。
如果你为它分配了内存(并且有一个有效的字符串),你可以打印它,因为printf不会改变它的参数。
否,因为局部变量将在函数出口上失效,并且您将返回指向不存在(在非此函数范围内)对象的指针。
int main() {
...
char *ptr;
for (int n=0; n<ips; n++) {
printf("%s\n", (ptr = fun(ip[n])) );
free(ptr);
}
return 0;
}
编辑后;
int main() {
...
char ptr[MAXHOSTNAMESIZE +1];
for (int n=0; n<ips; n++) {
printf("%s\n", (fun(ip[n], ptr)) );
}
return 0;
}
或
int main() {
...
char *ptr = malloc(MAXHOSTNAMESIZE +1);
for (int n=0; n<ips; n++) {
printf("%s\n", (fun(ip[n], ptr)) );
}
free(ptr)
return 0;
}
char *fun(char *ip, char *buff) {
struct addrinfo* res;
int error;
///......
error = getnameinfo(res->ai_addr, res->ai_addrlen, buff, NI_MAXHOST, NULL, 0, 0);
if (error != 0) {
fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(error));
}
//....
return buff;
}