首页 > 解决方案 > 在函数中重新分配输出指针

问题描述

我想知道为什么,当我运行以下代码时,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() 的 2 次调用之间存在竞争条件。

标签: c

解决方案


您只是在函数中修改 maint指针的参数副本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
}

推荐阅读