передача структуры функции не работает [дубликат]
В приведенном ниже коде я создал функцию отдельно от main, чтобы разделить int внутри структуры пополам.
После этого я хочу распечатать новое значение. Однако значение для распечатки остается прежним.
Я считаю, что моих фундаментальных знаний о структурах и указателях недостаточно.
Кто-нибудь может мне с этим помочь? Большое спасибо!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
Ответы
Функция divideизменяет копию этой структуры, поскольку структуры передаются по значению. Вам нужно будет передать указатель на структуру, чтобы функция могла изменить оригинал.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Вызывается divideс адресом исходной структуры
divide(&A);
Когда вы переходите Aк divide, создается копия A. Изменение этой копии внутри divideне влияет на локальную переменную, которую Aвы определили в main. Чтобы исправить это, вы можете сделать divideвзять указатель на person. Указатель эффективно представляет адрес в памяти, так что вы можете использовать его, например, для доступа к локальным переменным, определенным в других функциях, которые в противном случае были бы недоступны ( исследуйте кадры стека, если вы хотите понять, почему это так).
Так что на практике изменить divideподпись «s к: void divide(person *A)а в последней строке этой функции вы Ассинг не Aтолько к тому , что Aуказывает на с помощью оператора разыменования: *A = half. В вашей mainфункции вы затем передать адрес из Aвместо Aсебя для divideиспользования адреса оператора: divide(&A).
РЕДАКТИРОВАТЬ: даже лучше, вы можете избежать создания временного half, напрямую выполнив: A->age /= 2и A->wage /= 2где A.xсинтаксический сахар для (*A).x.