передача структуры функции не работает [дубликат]

Aug 16 2020

В приведенном ниже коде я создал функцию отдельно от 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);

}

Ответы

1 Miket25 Aug 16 2020 at 07:56

Функция divideизменяет копию этой структуры, поскольку структуры передаются по значению. Вам нужно будет передать указатель на структуру, чтобы функция могла изменить оригинал.

void divide(person* A)
{
    person half;

    half.age  = A->age  / 2;
    half.wage = A->wage / 2;
    
    *A = half;
}

Вызывается divideс адресом исходной структуры

divide(&A);
2 Peter Aug 16 2020 at 08:05

Когда вы переходите 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.