我查看了MSDN中的GetAdaptersInfo()示例:
http://msdn.microsoft.com/en-us/library/aa365917%28VS.85%29.aspx
并注意到,当示例尝试遍历所有适配器时,它只为第一个适配器分配内存。
这是一个错误吗?
如果没有,为什么不呢?所有适配器都具有相同的信息大小吗?
进一步澄清我的问题:我理解样本中对malloc的双重调用的作用。我不明白的是为什么在循环之外。如果系统中只有一个适配器,当然没有问题。但是当有多个适配器时会发生什么?这是一个错误吗?
感谢。
答案 0 :(得分:2)
此示例代码需要注意的一点是,如果调用GetAdaptersInfo之间的适配器数量增加,则会过度运行缓冲区。这是极不可能的,但代码仍然应该检查这种情况。
答案 1 :(得分:0)
看起来你错过了这部分代码示例。
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个适配器的情况下,第一次调用可能会成功地消除对第二次调用的需要。
答案 2 :(得分:0)
这不是错误 - 第一个调用是找出实际需要多少数据区域。
如果第一次调用失败并显示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,由于某种原因,它会避免第二次调用。