所有适配器使用GetAdaptersInfo()时malloc只有一次?

我查看了MSDN中的GetAdaptersInfo()示例:

http://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx

并注意到虽然示例尝试遍历所有适配器,但它只为第一个分配内存。

这是一个错误?

如果没有,为什么不呢? 所有的适配器都有相同的信息大小吗?

为了进一步澄清我的问题:我理解了在样本中对malloc的双重调用的作用。 我不明白的是为什么它在循环之外 。 如果系统中只有一个适配器,当然没有问题。 但是当有多个适配器时会发生什么? 这是一个错误?

谢谢。

这不是一个错误 – 第一个要求是找出实际需要多少数据区域。

如果这第一次调用失败ERROR_BUFFER_OVERFLOW,它也告诉你需要多少数据空间来保存所有的结果。 然后,该示例继续重新分配,并再次调用Win32以获取完整列表。 这是这里的代码,在你记下的迭代之前:

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { FREE(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfo\n"); return 1; } } if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { 

在我看来,在最好的情况下,第二次调用并不是必需的 – 从大多数机器中只有一个网络适配器的时候开始,这是一个合理的方法。 该示例似乎没有检查第一次调用NO_ERROR,这将排除第二,出于某种原因。

这个示例代码需要注意的一点是,如果在调用GetAdaptersInfo之间适配器的数量恰好增加,那么您将过度运行缓冲区。 这是不太可能的,但代码应该仍然检查这种情况。

看起来你错过了这部分代码示例。

 if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) { FREE(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen); if (pAdapterInfo == NULL) { printf("Error allocating memory needed to call GetAdaptersinfo\n"); return 1; } } 

此代码调用带有单个分配的适配器的GetAdaptersInfo 。 它基本上是针对机器上只有一个适配器的情况进行优化的。 在它接收到ERROR_BUFFER_OVERFLOW的情况下返回它改变它的分配在ulOutBufLen指定的大小(由函数调用更新)。

这是更改在多个适配器的情况下分配的内存量的行。

 pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen); 

编辑

在阅读Steve的评论后,我看起来更接近一些,看起来代码错误地调用了GetAdaptersInfo函数两次。 在1个适配器的情况下,第一次呼叫可能会成功地消除第二次呼叫的需要。