함수에 구조체 전달이 작동하지 않음 [중복]

Aug 16 2020

아래 코드에서는 구조체 내부의 int를 절반으로 나누기 위해 main과 별도로 함수를 만들었습니다.

그 후 새 값을 인쇄하고 싶습니다. 그러나 인쇄 값은 여전히 ​​오래된 것입니다.

구조체와 포인터에 대한 기본적인 지식이 충분하지 않다고 생각합니다.

누구든지 이것으로 나를 도울 수 있습니까? 감사합니다 !!!

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지역 변수에는 영향을주지 않습니다 . 이 문제를 해결하려면, 당신은 할 수 있습니다 테이크 포인터 로를 . 포인터는 메모리의 주소를 효과적으로 나타내므로 예를 들어 액세스 할 수없는 다른 함수에 정의 된 로컬 변수에 액세스 할 수 있습니다 ( 이유를 이해하려면 스택 프레임을 검색 합니다).Amaindivideperson

따라서 실제로 divide의 서명을 다음 void divide(person *A)과 같이 변경 합니다. 이 함수의 마지막 줄 에서 역 참조 연산자를 사용하여 가리키는 A것이 아니라 무엇이든 A지정합니다 : *A = half. 당신의에서 main기능 당신은 다음 통과 주소A대신 A자체 divide연산자의 주소를 사용하여 : divide(&A).

편집 : 더 나은, 당신은 임시을 만드는 피할 수 있습니다 half직접 수행하여 : A->age /= 2A->wage /= 2위치를 A.x위한 문법 설탕입니다 (*A).x.