Мне интересно, почему, когда я запускаю следующий код, значение 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 () существует состояние гонки.
При синхронных вызовах в однопоточной программе не может быть состояния гонки.
Посмотри внимательно на подпись realloc. Обратите внимание, как он возвращает новый указатель. Вы когда-нибудь задумывались, зачем это нужно?
@ Джордж "Длина имени может превышать MAX_COMPUTERNAME_LENGTH символов, поскольку DNS допускает более длинные имена. Чтобы обеспечить достаточный размер этого буфера, установите для этого параметра значение NULL и используйте требуемый размер буфера, возвращенный параметром lpnSize."
это вторая функция GetComputerNameExW и перераспределение для обработки исключений? пример утечки памяти или не верю Win API .. Я не понимаю





Вы просто изменяете копию параметра основного указателя t в функции 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
}
Поэтому, передавая WCHAR * t как WCHAR * c в get, я просто передаю адрес t как c, а затем заменяю указанный адрес на адрес WCHAR * tmp (Что, теперь, когда я думаю об этом, я знаю ...) Таким образом, использование указателя на указатель исправит это, поскольку я бы просто заменил указатель второго уровня, на который указывает указатель первого уровня ... Я мог бы жить с этим ...
Верно, но сам t никогда не модифицируется.
Присвоение нового значения параметру функции не имеет никакого эффекта вне этой функции. (Что вы ожидаете, если позвоните в
get(ComputerNameDnsHostname, 0)? Изменится ли значение0?)