Почему коректно не передается адрес в указатель в функции void UstatisClient(struct client nClient, struct statis * ptrstat)?

Изучаю указатели. Хочу вернуть структуру, объявленную как внешняя переменная, через аргумент функции использую указатель. Почему функция void UstatisClient(struct client nClient, struct statis * ptrstat) не возвращает корректно адрес внешне объявленной структуры?

#include <stdio.h>
#include <stdlib.h>
struct client
{
    unsigned telephone;
    int balance;
    int minut1, minut2, minut3;

} client1; // объявил внешнюю переменную

// Структура статистика в которую собираются данные сумме последних
// 3 разговоров и среднее значение разговоров
struct statis
{
    int summaMinut;
    int averageMinut;
} Ustatis; // объявляется внешняя переменная данной структуры



// Функция возврата статистики по клиенту с сохранением по переданному адресу структуры
void statisClient(struct client nClient, struct statis * ptrstat)
{
    int temp;
    temp = nClient.minut1 + nClient.minut2 + nClient.minut3;
    ptrstat->summaMinut = temp;
    temp /= 3;
    ptrstat->averageMinut = temp;
}

// Функция возврата статистики по клиенту с сохранением во внешнюю UStatis и передачи указателя на Ustatis
void UstatisClient(struct client nClient, struct statis * ptrstat)
{
    int temp;
    temp = nClient.minut1 + nClient.minut2 + nClient.minut3;
    Ustatis.summaMinut = temp;
    temp /= 3;
    Ustatis.averageMinut = temp;
    ptrstat = &Ustatis;
}

int main()
{
    client1.telephone = 404040;
    client1.balance = 1000;
    client1.minut1 = 3;
    client1.minut2 = 5;
    client1.minut3 = 1;
// При передачи по адресу  - работает корректно
    struct statis stat1;
    statisClient(client1, &stat1);
    printf("Statistica Client1: Summa of Minut is %d, \
average minute is %d", stat1.summaMinut, stat1.averageMinut);

 // При передачи указателем не получается
 // Не передается коректно адрес в указатель на внешнюю структуру Ustatis
 // Не могу понять почему
    struct statis * ptrstatis;
    UstatisClient(client1, ptrstatis);
    printf("Statistica Client1: Summa of Minut is %d, \
average minute is %d", (*ptrstatis).summaMinut, (*ptrstatis).averageMinut);

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Потому что вы меняете локальную переменную-указатель, а не записываете что-то по этому адресу... Чтобы вернуть указатель в переменную — надо передать указатель на нее:

void UstatisClient(struct client nClient, struct statis ** ptrstat)
{
    ....
    *ptrstat = &Ustatis;
}

....


struct statis * ptrstatis;
UstatisClient(client1, &ptrstatis);

Так вы записываете новое значение в саму переменную ptrstatis, а не в ее локальную копию.

→ Ссылка