在函数中重新分配输出指针

时间:2018-11-28 08:12:54

标签: c

我想知道为什么在运行以下代码时,t的值在调用get之后与以前相同。

我觉得问题是第11行在c = tmp处的重新分配-但希望有人能指出我正确的方向吗?

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

BOOL get(COMPUTER_NAME_FORMAT f, WCHAR* c) {
    DWORD s = 0;
    WCHAR* tmp = NULL;
    GetComputerNameExW(f, tmp, &s);
    tmp = (WCHAR*)realloc(tmp, sizeof(WCHAR) * s);
    GetComputerNameExW(f, tmp, &s);
    c = tmp;
    return TRUE;
}

void _tmain(int argc, _TCHAR* argv[])
{

    WCHAR* t = TEXT("thisisatest");
    BOOL res = get(ComputerNameDnsHostname, t);
    printf("%Ls\n", t);
}

为简洁起见,上面的代码已删除了错误处理代码。另外,我怀疑在两次调用GetComputerNameExW()之间存在争用情况。

1 个答案:

答案 0 :(得分:1)

您只是在t函数中修改main的get(COMPUTER_NAME_FORMAT f, WCHAR* c)指针的参数副本。

效果不会传播到get之外。 您正在将tmp的值分配给在get返回后丢失的临时指针。

通过c中的WCHAR** c作为get传递{}:

BOOL get(COMPUTER_NAME_FORMAT f, WCHAR** c){
  //stuff
  tmp = (WCHAR*)realloc(tmp, sizeof(WCHAR) * s);
  *c=tmp;
  //other stuff
}