传递字符串数组而不修改内容

时间:2016-03-29 21:30:38

标签: c arrays

我一直在尝试将一个字符串数组传递给一个查找主机所有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;

3 个答案:

答案 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地址,这可能是一个优秀的设计。