gpt4 book ai didi

C++转换题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:53 24 4
gpt4 key购买 nike

我知道我可以像这样正确使用 WinApi 函数 DsGetDcName:

DOMAIN_CONTROLLER_INFO* dcInfo = nullptr;

unsigned long res = ::DsGetDcName(nullptr,
nullptr,
nullptr,
nullptr,
0, &dcInfo);

这是不自然的,我知道,但我想明白为什么不能这样写:

    void* dcInfo = nullptr;
unsigned long res = ::DsGetDcName(nullptr,
nullptr,
nullptr,
nullptr,
0, (DOMAIN_CONTROLLER_INFO**) dcInfo);

if (res)
{
wchar_t* name;
name = static_cast<DOMAIN_CONTROLLER_INFO*> (dcInfo)->DomainControllerName;
}

第二个版本使用 void* 作为指针类型,这就是为什么我在运行它时遇到访问冲突(在调用 ::DsGetDcName 时)。但我不明白这是为什么?当为 dcInfo 指定 void* 而不是键入 DOMAIN_CONTROLLER_INFO* dcInfo 时,它是否与内存对齐方式有关?

解决方案

我发现了问题,我实际上可以使用复杂的不安全的 void* 版本,我只是没有将正确的指针地址传递给该函数。在这里:

void* dcInfo = nullptr;
unsigned long res = ::DsGetDcName(nullptr,
nullptr,
nullptr,
nullptr,
0, (DOMAIN_CONTROLLER_INFO**) &dcInfo);

请注意,我传递了 (DOMAIN_CONTROLLER_INFO**) &dcInfo 而不是 (DOMAIN_CONTROLLER_INFO**) dcInfo。之前我只是把自己关在脚下,因为我告诉编译器我知道我在做什么,但是向函数传递了一个指针值而不是所需指针的地址(是的,该指针值是 nullptr ) :-))

这是使用正确版本(版本 1)的另一个原因。在第二种情况下,缺点是您必须再次转换结果,如下所示:

wchar_t* name;
name = static_cast<DOMAIN_CONTROLLER_INFO*>(dcInfo)->DomainControllerName; // Get DC

最佳答案

因为该函数采用双间接指针。它是这样的:

void AllocateMemory(int** pTarget)
{
*pTarget = new int[10];

(*pTarget)[0] = 110;
}

你会这样调用它:

int main()
{
int* pAllocHere;
AllocateMemory(&pAllocHere);

int nValue;
nValue= pAllocHere[0]; // 110

return 0;
}

这将为您传递的 int 指针分配内存,并且您必须传递指针的地址,而不仅仅是 int** 类型转换 整数*

这不是因为DsGetDcName函数,而是因为C/C++语言。该函数不知道所需的大小,它会为您分配它。有许多 Windows 函数需要两次函数调用 - 一次确定大小(主要是 DWORD dwNeeded),一次实际完成工作。此函数一次调用为您分配内存,需要您调用NetApiBufferFree。稍后。

在 C++ 中,您可以使用 int*& 并更改签名:

void AllocateMemory(int*& pTarget);

然后这样调用:

int* pAllocHere;
AllocateMemory(pAllocHere);

但是Windows API必须使用C语言。

关于C++转换题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7113099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com