2010-10-20 78 views
1

我看着GetAdaptersInfo()樣品中MSDN:使用GetAdaptersInfo()時,Malloc只有一次適用於所有適配器?

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

,注意到的是,雖然樣品嚐試通過所有適配器迭代,它僅分配用於第一個存儲器。

這是一個錯誤?

如果不是,爲什麼不呢?所有適配器都具有相同的信息大小嗎?

爲了進一步澄清我的問題:我理解了在樣本中雙重調用malloc的作用。我不明白的是爲什麼在循環外之外。如果系統中只有一個適配器,當然沒有問題。但是當有多個適配器時會發生什麼?這是一個錯誤?

謝謝。

+0

我沒有看到任何問題。循環只遍歷它已經獲得的適配器;它不是試圖獲得更多。通常情況下,由於內容在運行時可能會發生變化,因此循環遍歷分配,但在枚舉時不太可能將更多適配器添加到系統中,因此只需使用兩個分配即可。 – Luke 2010-10-20 21:56:18

回答

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,由於某種原因,這會避免第二次調用。

+0

史蒂夫,謝謝。在我發佈我的問題之前,我明白了樣本中對malloc的雙重調用的作用。我不明白的是爲什麼它在循環之外**。如果系統中只有一個適配器,那當然沒有問題。但是當有多個適配器時會發生什麼?這是一個錯誤? – 2010-10-20 21:17:45

+1

@Android - 不,第二次調用一次返回所有適配器的信息,每個結構鏈接到下一個,即使它們在單個內存塊中。 – 2010-10-20 22:23:00

+0

@Steven,+1提到我的具體問題。在您的幫助下,我終於能夠發現文檔中的微小參考了pOutBufLen與所有適配器的信息大小有關的事實:它實際上在pAdapterInfo的描述中: 「指向接收鏈表的緩衝區的指針IP_ADAPTER_INFO結構「。 – 2010-10-20 23:20:59

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); 

編輯

讀史蒂夫的評論後,我看着有點接近,看來,該代碼被錯誤地調用GetAdaptersInfo功能的兩倍。在1個適配器的情況下,第一次通話可能會導致成功消除第二次通話的需要。

+0

這就是我的想法,但優化不是阿法可以看到的。 2次通話總是發生。 – 2010-10-20 21:12:49

+0

@是的,這太奇怪了。看起來像樣本恕我直言 – JaredPar 2010-10-20 21:15:50

+0

謝謝 - 我明白在樣品中的雙重調用malloc的作用。我不明白的是爲什麼它在循環之外**。如果系統中只有一個適配器,當然沒有問題。但是當有多個適配器時會發生什麼?這是一個錯誤? – 2010-10-20 21:16:14

2

這個示例代碼需要注意的一件事是,如果在調用GetAdaptersInfo之間適配器的數量恰好增加,那麼您將運行緩衝區。這是不太可能的,但代碼應該仍然檢查這種情況。

+0

優秀點。這就是「好程序」和高級程序之間的區別。 – 2010-10-22 14:56:41

相關問題