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;과 같이 구조체 포인터를 선언했습니다. 아직까지는 p1ptr은 관계가 없습니다.

구조체 변수는 주소 연산자 &를 사용하여 메모리 주소를 구할 수 있으며 이렇게 구한 메모리 주소는 구조체 포인터에 할당할 수 있습니다.

ptr = &p1;    // p1의 메모리 주소를 구하여 ptr에 할당

ptr은 구조체 포인터이므로 ->로 멤버에 접근하여 값을 할당하였습니다. 그리고 printf 함수로 p1의 멤버와 ptr의 멤버를 출력해보면 같은 값이 나오는 것을 알 수 있습니다.

// 화살표 연산자로 구조체 멤버에 접근하여 값 할당
ptr->age = 30;

printf("나이: %d\n", p1.age);      // 나이: 30: 구조체 변수의 멤버 값 출력
printf("나이: %d\n", ptr->age);    // 나이: 30: 구조체 포인터의 멤버 값 출력

즉, ptrp1의 메모리 주소를 할당했으므로 ptr의 멤버를 수정하면 결국 p1의 멤버도 바뀝니다. 접근하는 방식만 차이가 있을 뿐 결국 같은 곳의 내용을 수정하게 됩니다(메모리 주소는 컴퓨터마다, 실행할 때마다 달라집니다).

그림 49‑3 구조체 변수의 주소와 구조체 포인터

지금까지 구조체 포인터의 사용 방법을 배웠습니다. 여기서는 구조체 포인터에 malloc으로 메모리를 할당하고 free로 해제한다는 점과 멤버에 접근할 때 ->를 사용한다는 점만 기억하면 됩니다.