我一直在尝试将一个字符串数组传递给一个查找主机所有IP地址的函数。我的问题是在我向阵列填充内容意外更改的地址后立即出现问题。我将字符串分配给数组的一部分后立即打印数组的内容,这就是我知道我正在初始化数组的方式。然后在循环完成后,我尝试访问数组中的所有地址,并将所有值更改为我最后传递到数组中的值。为什么是这样?我究竟做错了什么? 这是功能:
static int getHostIP(char*ip_list[])
{
char hostName[80];
if(gethostname(hostName, sizeof(hostName)) == SOCKET_ERROR)
{
printf("Error %s when getting host name.\n", WSAGetLastError());
return 1;
}
printf("Hostname: %s\n", hostName);
struct addrinfo *result = NULL;
if(getaddrinfo(hostName,NULL, NULL, &result) == 1)
{
printf("Error %s when getting host address info.\n", WSAGetLastError());
return 1;
}
//iterate over IP addresses
struct addrinfo *ptr;
int x = 0;
for(x = 0,ptr = result; ptr != NULL;ptr = ptr->ai_next, x++)
{
struct sockaddr_in *hostaddr = (struct sockaddr_in*)ptr->ai_addr;
char ip_addr[80];
inet_ntop(ptr->ai_family,(void*)&hostaddr->sin_addr, ip_addr, sizeof(ip_addr));
ip_list[x] = ip_addr;
}
int i;
for(i = 0; i < 7;i++)
{
printf("IP: %s\n", ip_list[i]);
}
return 0;
}
修改 致电代码:
char * ip_list[80] = {0};
//TODO: Get Host IP address
if(getHostIP(ip_list) == 1) return 1;
答案 0 :(得分:1)
您遇到的行为是由变量ip_addr
引起的,该变量在每次迭代期间始终指向堆栈中的同一缓冲区。因此,ip_list
中的所有指针都指向同一个缓冲区,该缓冲区包含在循环的最后一次迭代中计算的值。
如果使用malloc
在堆中分配此缓冲区,则问题应该解决,因为现在循环块将为每个ip创建一个新缓冲区。例如:
#define BUFFER_SIZE 80 // no in the function body
char * ip_addr = NULL;
for(x = 0,ptr = result; ptr != NULL;ptr = ptr->ai_next, x++)
{
ip_addr = malloc(BUFFER_SIZE);
struct sockaddr_in *hostaddr = (struct sockaddr_in*)ptr->ai_addr;
inet_ntop(ptr->ai_family,(void*)&hostaddr->sin_addr, ip_addr, BUFFER_SIZE);
ip_list[x] = ip_addr;
}
答案 1 :(得分:-1)
您的数据是如何分配的?
尝试:
static int getHostIP(char**ip_list)
答案 2 :(得分:-1)
您是否正确初始化传入此函数的数组。您正在声明一个char指针数组的输入。当您在c中传递数组时,您还必须传递数组初始化的长度。内存需要存在于某处并由系统保留。
您能否提供致电代码,以便我们看到您做错了什么。
或者---你可以传递整个数组byref,这样你就可以得到一个out指针,这个数组将被这个函数声明。因为您不知道可能匹配多少个IP地址,这可能是一个优秀的设计。