함수에 구조체 전달이 작동하지 않음 [중복]
아래 코드에서는 구조체 내부의 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);
}
답변
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
의 서명을 다음 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
.