在C中获取具有GetAdapterAddresses的网络适配器时发生访问冲突

在C中获取具有GetAdapterAddresses的网络适配器时发生访问冲突,c,networking,adapter,access-violation,C,Networking,Adapter,Access Violation,我不知道源代码是否错误,但当我尝试在我的C项目中使用它时,我总是得到臭名昭著的结果 访问冲突读取位置0xFFFFFFFFFFFF 我尝试过增加缓冲区大小,但似乎没有什么办法解决它。我认为这是在第一个适配器通过循环之后发生的 #include <stdio.h> #include <string.h> #include <locale.h> #include <winsock2.h> #include <iptypes.h> #inclu

我不知道源代码是否错误,但当我尝试在我的C项目中使用它时,我总是得到臭名昭著的结果

访问冲突读取位置0xFFFFFFFFFFFF

我尝试过增加缓冲区大小,但似乎没有什么办法解决它。我认为这是在第一个适配器通过循环之后发生的

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <winsock2.h>
#include <iptypes.h>
#include <iphlpapi.h>
#include <windows.h>

#pragma comment(lib, "IPHLPAPI.lib")

#define MALLOC(x)       HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x)         HeapFree(GetProcessHeap(), 0, (x))

FILE* fLog = NULL;

void netinfo() {
    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;

    DWORD dwRetVal = 0;
    ULONG outBufLen = 15000;
    ULONG iter = 0;
    do {
        pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
        if (pAddresses == NULL) {
            fwprintf(fLog, L"MALLOC error");
            break;

            dwRetVal = GetAdaptersAddresses(
                AF_UNSPEC,
                GAA_FLAG_INCLUDE_PREFIX,
                NULL,
                pAddresses,
                &outBufLen
            );

            if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
                FREE(pAddresses);
                pAddresses = NULL;
                fwprintf(fLog, L"GetAdaptersAddresses() error");
            } else {
                break;
            }

            iter++;
        }
    } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (iter < 3));

    wchar_t netAddressLog[256];
    if (dwRetVal == NO_ERROR && pAddresses != NULL) {
        pCurrAddresses = pAddresses;
        while (pCurrAddresses) {
            // this is where the debugger stops !!!
            swprintf(netAddressLog, 256, L"Index: %u", pCurrAddresses->IfIndex);
            fwprintf(fLog, netAddressLog);
            pCurrAddresses = pCurrAddresses->Next;
        }
    } else {
        fwprintf(fLog, L"GetAdaptersAddresses() error");
    }

    if (pAddresses) {
        FREE(pAddresses);
    }
}

int main(int argc, char **argv) {
    errno_t error = _wfopen_s(&fLog, L"log.txt", L"a+");

    netinfo();

    fclose(fLog);
}
因此,当试图访问pCurrAddresses->IfIndex时,程序在第一个循环中记录了一些奇怪的大数字作为索引后失败。我试图将mi稍微修改过的代码与MSDN中的代码进行比较,但我想不出来


我知道我的代码需要更好的组织,但目前这是一个拦截器,while循环块中存在一些问题:

do {
    pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
    if (pAddresses == NULL) {
        fwprintf(fLog, L"MALLOC error");
        break;
        /* a } is missing here*/

        dwRetVal = GetAdaptersAddresses(
            AF_UNSPEC,
            GAA_FLAG_INCLUDE_PREFIX,
            NULL,
            pAddresses,
            &outBufLen
        );

        if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
            FREE(pAddresses);
            pAddresses = NULL;
            fwprintf(fLog, L"GetAdaptersAddresses() error");
        } else {
            break;
        }

        iter++;
    }
} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (iter < 3));
正确的纠正代码可以是:

do {
    pAddresses = (IP_ADAPTER_ADDRESSES*)MALLOC(outBufLen);
    if (pAddresses == NULL) {
        fwprintf(fLog, L"MALLOC error");
        break;
    }
    dwRetVal = GetAdaptersAddresses(
        AF_UNSPEC,
        GAA_FLAG_INCLUDE_PREFIX,
        NULL,
        pAddresses,
        &outBufLen
    );

    if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
        FREE(pAddresses);
        pAddresses = NULL;
        fwprintf(fLog, L"GetAdaptersAddresses() error");
    } else {
        break;
    }

    iter++;        
} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (iter < 3));

由于netInfo中未定义fLog,此代码如何运行?抱歉,在选择代码时错过了。现在它在那里了