使用`addrinfo`结构进行内存管理

问题描述 投票:0回答:1

我刚开始使用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) { : : : } 而不是resultfreeaddrinfo的结构?换句话说,我从未见过有人打电话给hints

另外一件事,我应该预先分配内存或初始化entry形式的结构吗?如果是这样,我该怎么做?

c sockets getaddrinfo
1个回答
2
投票
  1. 刚刚浏览过......这是因为getaddrinfo会动态分配内存吗?

是。更具体地说,它为freeaddrinfo(hints)指针指向的链表分配内存。由于库是代表您分配内存的,因此库实现者还为您提供了释放内存的API。

  1. 如果是这种情况,我应该在上面的例子中预先分配内存/初始化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
© www.soinside.com 2019 - 2024. All rights reserved.