Почему коректно не передается адрес в указатель в функции 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, а не в ее локальную копию.