我按照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并且代码运行良好。
我想知道为什么调用p
后freeaddrinfo
不为空?
答案 0 :(得分:2)
在循环之后,指针p
或者指向用于成功创建和绑定套接字的addrinfo
结构,如果没有任何结构可以是NULL
使用
在循环和检查之间调用freeaddrinfo
并不重要,因为您没有取消引用变量p
,您只需检查它是否为' sa空指针与否。
但是,如果您在调用p
后尝试取消引用freeaddrinfo
,那么您将尝试访问不再分配给您的内存,并且您将拥有未定义的行为
freeaddrinfo
来电并不会改变您的任何变量,它无法实现。如果您的指针分配了malloc
,然后使用该变量调用free
,则它不会将变量设置为NULL
,也不能设置任何其他变量指向与NULL
相同的记忆。阅读更多关于按值传递参数和模拟c 中的引用传递以了解更多有关原因的信息。
答案 1 :(得分:0)
与使用free时发生的情况没什么不同 - 指针仍指向同一地址但实际内存未分配。这不是一个简单的免费电话的原因是你实际上是免费的资源列表。从手册:
freeaddrinfo()函数释放为其分配的内存 动态分配的链表res。