我刚开始使用C语言中的UDP套接字,我有一个与内存管理有关的问题。通常的例子显示以下内容
struct addrinfo *result; //to store results
struct addrinfo hints; //to indicate information we want
:
:
:
if( (s = getaddrinfo(hostname, NULL, &hints, &result)) != 0){
fprintf(stderr, "getaddrinfo: %s\n",gai_strerror(s));
exit(1);
}
:
:
:
//free the addrinfo struct
freeaddrinfo(result);
我也看到引入了一个额外的本地qazxsw poi结构用于qazxsw poi循环循环通过addrinfo
为了提取一个特定的条目......这样的事情
for
我的问题是为什么result
是唯一传递给struct addrinfo *entry; //to store a result from linked list
:
:
:
for (entry = result; entry != NULL; entry = entry->ai_next)
{
:
:
:
}
而不是result
或freeaddrinfo
的结构?换句话说,我从未见过有人打电话给hints
。
另外一件事,我应该预先分配内存或初始化entry
形式的结构吗?如果是这样,我该怎么做?
是。更具体地说,它为freeaddrinfo(hints)
指针指向的链表分配内存。由于库是代表您分配内存的,因此库实现者还为您提供了释放内存的API。
addrinfo
吗?为什么不传递给freeaddrinfo不.result
只是一个用于迭代列表的变量。它非常相似
entry
循环,你会发现其他任何地方。 entry
只是一个迭代器。
如果你不想,你根本不必使用`for (i = 0; i < n; i++)`
变量。您只需使用while循环即可遍历链表
i
如果你仔细观察,你会发现你正在将entry
变量本身移动到列表的末尾。如果以这种方式迭代,则无法释放内存,因为您丢失了getaddrinfo()返回给您的起始地址。要解决此问题,可以将起始地址保存在临时变量中,然后使用while循环。只需在while循环之前添加此行。
while (result != NULL) {
//Do what you have to do here
result = result->ai_next;
}
你现在可以免费使用result
指针,而不是struct addrinfo *entry = result; //save the starting address
while (...) {
}
。效果是一样的。
entry