gpt4 book ai didi

c - 在不修改内容的情况下传递字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:37 25 4
gpt4 key购买 nike

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

最佳答案

您遇到的行为是由变量 ip_addr 引起的,它在每次迭代期间始终指向堆栈中的同一缓冲区。因此,ip_list 中的所有指针都指向同一个缓冲区,其中包含在循环的最后一次迭代中计算的值。

如果您使用 malloc 在堆中分配此缓冲区,问题应该得到解决,因为现在循环 block 将为每个 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;
}

关于c - 在不修改内容的情况下传递字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36295457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com