Переназначение указателя вывода в функции

Мне интересно, почему, когда я запускаю следующий код, значение 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 () существует состояние гонки.

Присвоение нового значения параметру функции не имеет никакого эффекта вне этой функции. (Что вы ожидаете, если позвоните в get(ComputerNameDnsHostname, 0)? Изменится ли значение 0?)

molbdnilo 28.11.2018 09:15

При синхронных вызовах в однопоточной программе не может быть состояния гонки.

molbdnilo 28.11.2018 09:16

Посмотри внимательно на подпись realloc. Обратите внимание, как он возвращает новый указатель. Вы когда-нибудь задумывались, зачем это нужно?

n. 1.8e9-where's-my-share m. 28.11.2018 09:17

@ Джордж "Длина имени может превышать MAX_COMPUTERNAME_LENGTH символов, поскольку DNS допускает более длинные имена. Чтобы обеспечить достаточный размер этого буфера, установите для этого параметра значение NULL и используйте требуемый размер буфера, возвращенный параметром lpnSize."

melpomene 28.11.2018 09:23

это вторая функция GetComputerNameExW и перераспределение для обработки исключений? пример утечки памяти или не верю Win API .. Я не понимаю

sangho 28.11.2018 09:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы просто изменяете копию параметра основного указателя 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 (Что, теперь, когда я думаю об этом, я знаю ...) Таким образом, использование указателя на указатель исправит это, поскольку я бы просто заменил указатель второго уровня, на который указывает указатель первого уровня ... Я мог бы жить с этим ...

MadsRC 28.11.2018 09:39

Верно, но сам t никогда не модифицируется.

Davide Spataro 28.11.2018 09:40

Другие вопросы по теме