49.3 구조체 포인터에 구조체 변수의 주소 할당하기
지금까지 malloc 함수로 구조체 포인터에 동적 메모리를 할당했습니다. 그럼 동적 메모리를 할당하지 않고 구조체 포인터를 사용하는 방법은 없을까요? 이때는 구조체 변수에 & (주소 연산자)를 사용하면 됩니다.
- 구조체포인터 = &구조체변수;
다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
pointer_to_struct.c
#include <stdio.h> struct Person { // 구조체 정의 char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 }; int main() { struct Person p1; // 구조체 변수 선언 struct Person *ptr; // 구조체 포인터 선언 ptr = &p1; // p1의 메모리 주소를 구하여 ptr에 할당 // 화살표 연산자로 구조체 멤버에 접근하여 값 할당 ptr->age = 30; printf("나이: %d\n", p1.age); // 나이: 30: 구조체 변수의 멤버 값 출력 printf("나이: %d\n", ptr->age); // 나이: 30: 구조체 포인터의 멤버 값 출력 return 0; }
실행 결과
나이: 30 나이: 30
먼저 struct Person p1;과 같이 구조체 변수를 선언하고, struct Person *ptr;과 같이 구조체 포인터를 선언했습니다. 아직까지는 p1과 ptr은 관계가 없습니다.
구조체 변수는 주소 연산자 &를 사용하여 메모리 주소를 구할 수 있으며 이렇게 구한 메모리 주소는 구조체 포인터에 할당할 수 있습니다.
ptr = &p1; // p1의 메모리 주소를 구하여 ptr에 할당
ptr은 구조체 포인터이므로 ->로 멤버에 접근하여 값을 할당하였습니다. 그리고 printf 함수로 p1의 멤버와 ptr의 멤버를 출력해보면 같은 값이 나오는 것을 알 수 있습니다.
// 화살표 연산자로 구조체 멤버에 접근하여 값 할당 ptr->age = 30; printf("나이: %d\n", p1.age); // 나이: 30: 구조체 변수의 멤버 값 출력 printf("나이: %d\n", ptr->age); // 나이: 30: 구조체 포인터의 멤버 값 출력
즉, ptr에 p1의 메모리 주소를 할당했으므로 ptr의 멤버를 수정하면 결국 p1의 멤버도 바뀝니다. 접근하는 방식만 차이가 있을 뿐 결국 같은 곳의 내용을 수정하게 됩니다(메모리 주소는 컴퓨터마다, 실행할 때마다 달라집니다).
지금까지 구조체 포인터의 사용 방법을 배웠습니다. 여기서는 구조체 포인터에 malloc으로 메모리를 할당하고 free로 해제한다는 점과 멤버에 접근할 때 ->를 사용한다는 점만 기억하면 됩니다.