gpt4 book ai didi

c - freeaddrinfo 上发生了什么事?

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:38 25 4
gpt4 key购买 nike

我正在按照 Beej's Guide to Network Programming 学习网络编程文章。有一个例子:

struct addrinfo hints, *servinfo, *p;

if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}

// loop through all the results and bind to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
//socket(...)
//bind(...)
break;
}

freeaddrinfo(servinfo); // all done with this structure

if (p == NULL) {
fprintf(stderr, "server: failed to bind\n");
exit(1);
}

bind()之后,调用了freeaddrinfo()。我认为 servinfo 链接列表现在应该是 NULL,指针 p 也应该是 NULL,但是不,p 不是 NULL 并且代码运行良好。

我想知道为什么调用freeaddrinfop不为空?

最佳答案

在循环之后,指针p要么指向用于成功创建和绑定(bind)套接字的addrinfo结构,要么为NULL 如果没有一个结构可以使用。

在循环和检查之间调用了 freeaddrinfo 无关紧要,因为您没有取消引用变量 p,您只检查它是否为 null -指针与否。

但是,如果您在调用 freeaddrinfo 之后尝试取消引用 p,那么您将尝试访问不再分配给您的内存,并且您将拥有 未定义的行为

freeaddrinfo 调用不会更改您的任何变量,它不能。如果您有一个用 malloc 分配的指针,然后您使用该变量调用 free,它不会将该变量设置为 NULL,也不会它将指向同一内存的任何其他变量设置为 NULL。阅读有关按值传递参数在 c 中模拟按引用传递的更多信息,以了解有关原因的更多信息。

关于c - freeaddrinfo 上发生了什么事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37959585/

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