freeaddrinfo上发生了什么?

时间:2016-06-22 05:51:59

标签: c sockets network-programming

我按照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并且代码运行良好。

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

2 个答案:

答案 0 :(得分:2)

在循环之后,指针p或者指向用于成功创建和绑定套接字的addrinfo结构,如果没有任何结构可以是NULL使用

在循环和检查之间调用freeaddrinfo并不重要,因为您没有取消引用变量p,您只需检查它是否为' sa空指针与否。

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

freeaddrinfo来电并不会改变您的任何变量,它无法实现。如果您的指针分配了malloc,然后使用该变量调用free,则它不会将变量设置为NULL,也不能设置任何其他变量指向与NULL相同的记忆。阅读更多关于按值传递参数模拟c 中的引用传递以了解更多有关原因的信息。

答案 1 :(得分:0)

与使用free时发生的情况没什么不同 - 指针仍指向同一地址但实际内存未分配。这不是一个简单的免费电话的原因是你实际上是免费的资源列表。从手册:

  

freeaddrinfo()函数释放为其分配的内存   动态分配的链表res。