C 구조체와 포인터 마스터하기: 실전 가이드
C 구조체와 포인터 마스터하기: 실전 가이드
포인터로 구조체 멤버를 탐색하고, 유연한 C 자료구조를 위한 동적 메모리 할당을 학습하세요.
구조체와 포인터를 다루기 전에 다음 기초 주제를 숙지하세요:
포인터로 구조체 참조하기
구조체를 선언하고 이를 참조하는 포인터를 선언하는 간결한 예제입니다.
struct Person {
int member1;
int member2;
/* 추가 멤버들 */
};
int main(void) {
struct Person *ptr, harry;
/* ptr은 이제 아무 Person 인스턴스나 가리킬 수 있음 */
}
이 스니펫에서 ptr은 struct Person 인스턴스를 가리키는 포인터입니다.
예제: 포인터를 통한 구조체 멤버 접근
포인터로 구조체 필드를 읽거나 쓰려면 -> 연산자를 사용합니다.
#include <stdio.h>
struct Person {
int age;
float weight;
};
int main(void) {
struct Person *personPtr, person1;
personPtr = &person1; /* person1 가리키기 */
printf("나이 입력: ");
scanf("%d", &personPtr->age);
printf("몸무게 입력: ");
scanf("%f", &personPtr->weight);
printf("\n출력:\n");
printf("나이: %d\n", personPtr->age);
printf("몸무게: %f", personPtr->weight);
return 0;
}
여기서 personPtr = &person1;은 person1의 주소를 personPtr에 저장합니다. 이후 personPtr->field 접근은 (*personPtr).field와 동일하며 간결한 문법을 제공합니다.
personPtr->age는 (*personPtr).age와 동일
personPtr->weight는 (*personPtr).weight와 동일
구조체 동적 메모리 할당
컴파일 타임에 필요한 구조체 인스턴스 수를 알 수 없을 때, C 표준 라이브러리를 사용해 런타임에 메모리를 할당합니다.
예제: 구조체 배열 할당
#include <stdio.h>
#include <stdlib.h>
struct Person {
int age;
float weight;
char name[30];
};
int main(void) {
struct Person *ptr;
int i, n;
printf("사람 수 입력: ");
scanf("%d", &n);
ptr = (struct Person*)malloc(n * sizeof(struct Person));
if (!ptr) {
fprintf(stderr, "Memory allocation failed\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; ++i) {
printf("이름과 나이를 각각 입력: ");
scanf("%s %d", (ptr + i)->name, &(ptr + i)->age);
}
printf("\n정보 출력:\n");
for (i = 0; i < n; ++i) {
printf("Name: %s\tAge: %d\n", (ptr + i)->name, (ptr + i)->age);
}
free(ptr);
return 0;
}
프로그램 실행 결과:
사람 수 입력: 2
이름과 나이를 각각 입력: Harry 24
이름과 나이를 각각 입력: Gary 32
정보 출력:
Name: Harry Age: 24
Name: Gary Age: 32
이 예제는 struct Person 인스턴스 n개를 힙에 생성하고, 사용자 입력을 각 인스턴스에 읽어들인 뒤 결과를 출력하는 방법을 보여줍니다.