49.2 구조체 별칭으로 포인터를 선언하고 메모리 할당하기
struct 키워드로 포인터를 선언하고 메모리를 할당했으니 typedef로 정의한 구조체 별칭으로도 포인터를 선언하고 메모리를 할당할 수 있겠죠?
- 구조체별칭 *포인터이름 = malloc(sizeof(구조체별칭));
다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
typedef_struct_alloc_memory.c
#define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include <stdio.h> #include <string.h> // strcpy 함수가 선언된 헤더 파일 #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 typedef struct _Person { // 구조체 이름은 _Person char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의 int main() { Person *p1 = malloc(sizeof(Person)); // 구조체 별칭으로 포인터 선언, 메모리 할당 // 화살표 연산자로 구조체 멤버에 접근하여 값 할당 strcpy(p1->name, "홍길동"); p1->age = 30; strcpy(p1->address, "서울시 용산구 한남동"); // 화살표 연산자로 구조체 멤버에 접근하여 값 출력 printf("이름: %s\n", p1->name); // 홍길동 printf("나이: %d\n", p1->age); // 30 printf("주소: %s\n", p1->address); // 서울시 용산구 한남동 free(p1); // 동적 메모리 해제 return 0; }
실행 결과
이름: 홍길동 나이: 30 주소: 서울시 용산구 한남동
구조체 별칭을 사용하면 포인터를 선언하고 메모리를 할당하는 방법이 좀 더 간단합니다. Person *p1과 같이 구조체 별칭으로 포인터를 바로 선언한 뒤 malloc 함수로 메모리를 할당합니다. 이때 할당할 메모리 크기도 sizeof(Person)처럼 구조체 별칭으로 구하면 됩니다.
Person *p1 = malloc(sizeof(Person)); // 구조체 별칭으로 포인터 선언, 메모리 할당
단지 struct 키워드가 생략되었을 뿐인데 문법이 매우 간단해졌습니다. 앞으로 프로그램을 작성할 때는 구조체 별칭을 적극적으로 활용하세요.
구조체 별칭으로 선언한 포인터도 구조체 멤버에 접근할 때는 -> (화살표 연산자)를 사용합니다.
// 화살표 연산자로 구조체 멤버에 접근하여 값 할당 strcpy(p1->name, "홍길동"); p1->age = 30; strcpy(p1->address, "서울시 용산구 한남동"); // 화살표 연산자로 구조체 멤버에 접근하여 값 출력 printf("이름: %s\n", p1->name); // 홍길동 printf("나이: %d\n", p1->age); // 30 printf("주소: %s\n", p1->address); // 서울시 용산구 한남동
마지막으로 구조체를 다 사용했다면 반드시 free 함수로 메모리를 해제해줍니다.
익명 구조체도 실제로 사용하려면 구조체 별칭을 지정해줘야 하므로 메모리 할당 방법은 앞과 같습니다.
anonymous_struct_alloc_memory.c
#define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include <stdio.h> #include <string.h> // strcpy 함수가 선언된 헤더 파일 #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 typedef struct { // 구조체 이름이 없는 익명 구조체 char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의 int main() { Person *p1 = malloc(sizeof(Person)); // 구조체 별칭으로 포인터 선언, 메모리 할당 // 화살표 연산자로 구조체 멤버에 접근하여 값 할당 strcpy(p1->name, "홍길동"); p1->age = 30; strcpy(p1->address, "서울시 용산구 한남동"); // 화살표 연산자로 구조체 멤버에 접근하여 값 출력 printf("이름: %s\n", p1->name); // 홍길동 printf("나이: %d\n", p1->age); // 30 printf("주소: %s\n", p1->address); // 서울시 용산구 한남동 free(p1); // 동적 메모리 해제 return 0; }
실행 결과
이름: 홍길동 나이: 30 주소: 서울시 용산구 한남동