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() 的 2 次调用之间存在竞争条件。
解决方案
您只是在函数中修改 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
}