본문 바로가기
정보글

자세한 예제와 함께 배우는 구조체 동적 할당 방법

by 푸포하니 2023. 5. 30.

1. 구조체란?

 

 

 

[1. 구조체란?]

 

구조체(structure)는 여러 개의 데이터를 묶어 하나의 자료형으로 정의한 것으로, 프로그램에서 구조체를 이용해 복합적인 데이터를 쉽게 관리할 수 있습니다. 구조체의 각각의 데이터를 멤버(member)라고 부르며, 각 멤버는 각각의 자료형을 가질 수 있습니다.

 

예를 들어, 학생 정보를 다루는 프로그램에서 구조체를 정의하고 멤버로 학생의 이름, 학과, 학번, 성적 등을 선언할 수 있습니다. 이렇게 구조체를 정의하면 명확하고 구체적인 데이터를 프로그램에서 쉽게 다룰 수 있습니다.

 

구조체는 다른 구조체나 배열, 포인터 등과 함께 복잡한 자료형을 만들거나, 데이터를 저장하거나, 처리하는 것이 가능합니다. 또한, 구조체를 이용해 데이터의 종류와 형태에 따라 하나의 구조체를 다른 구조체에 내포(embed)시킬 수도 있습니다. 이를 통해 프로그램의 관리와 효율성을 높일 수 있습니다.

 

구조체는 C언어에서 자주 사용되는 기본적인 자료형으로, 동적 할당을 이용하여 메모리에 할당하는 방법을 알아보겠습니다.

 

 

 

2. 구조체 동적 할당이란?

 

 

 

구조체를 선언하면 그 크기만큼의 메모리 공간이 스택에 자동으로 할당된다. 하지만 때로는 프로그램 실행 중에 필요한 크기를 모르는 경우가 있을 수 있다. 예를 들어, 구조체 내부에 포인터 변수가 있을 때 이 변수에 동적 할당된 메모리를 할당해야 한다는 경우가 그렇다. 이런 경우에 구조체를 동적으로 할당해야 한다.

 

구조체를 동적으로 할당하면 해당 구조체의 메모리 공간이 힙 영역에 할당되며, 필요할 때마다 메모리를 동적으로 할당하여 구조체 내부의 포인터 변수와 연결할 수 있다.

 

동적으로 구조체를 할당하는 방법은 매우 간단하다. 구조체 타입의 포인터 변수를 선언하고, 이 변수에 malloc() 함수를 이용하여 동적으로 할당할 크기만큼의 메모리 공간을 할당한다. 그리고 이 포인터 변수를 이용하여 할당된 구조체를 조작하면 된다.

 

예를 들어, 다음 코드는 student 구조체를 동적으로 할당하고, 할당된 구조체에 값을 지정하여 출력하는 코드이다.

 

```c

 

#include

 

#include

 

typedef struct {

 

char name[20];

 

int age;

 

char major[20];

 

} student;

 

int main() {

 

student *s = (student *)malloc(sizeof(student)); // student 구조체 동적 할당

 

printf("이름을 입력하세요: ");

 

scanf("%s", s->name); // -> 연산자를 이용하여 구조체 멤버 변수에 접근

 

printf("나이를 입력하세요: ");

 

scanf("%d", &s->age); // & 연산자를 이용하여 구조체 포인터 변수에 접근하여 멤버 변수에 접근

 

printf("전공을 입력하세요: ");

 

scanf("%s", s->major);

 

printf("이름: %s ", s->name);

 

printf("나이: %d ", s->age);

 

printf("전공: %s ", s->major);

 

free(s); // 할당된 메모리 해제

 

return 0;

 

}

 

```

 

위 코드에서 실제로 구조체 멤버 변수에 접근할 때는 -> 연산자를 이용하여 구조체 포인터 변수 s의 멤버 변수에 접근한다. 또한, 포인터 변수를 선언할 때에는 struct 키워드 대신 typedef를 이용하여 별칭을 지정하여 간결하게 코드를 작성할 수 있다.

 

 

 

3. 구조체 동적 할당 방법 설명

 

 

 

구조체를 동적으로 할당하는 방법은 `malloc()` 함수를 이용하는 것이다. `malloc()` 함수는 메모리를 동적으로 할당해주는 함수이며, 이 함수를 이용해 구조체 변수를 동적으로 할당할 수 있다.

 

예를 들어, 다음과 같은 구조체가 있다고 하자.

 

```c

 

typedef struct {

 

int id;

 

char name[20];

 

} Student;

 

```

 

이 구조체를 동적으로 할당하기 위해서는 다음과 같이 코드를 작성해야 한다.

 

```c

 

Student* studentPtr; // 포인터 선언

 

studentPtr = (Student*)malloc(sizeof(Student)); // 구조체 동적 할당

 

```

 

위 코드에서 `Student* studentPtr`은 구조체 포인터를 선언한 것이다. 그리고 `malloc()` 함수 안에는 `sizeof(Student)`를 입력함으로써 구조체의 크기를 동적으로 할당한다.

 

이후에는 구조체 멤버에 접근하기 위해 `->` 연산자를 이용한다.

 

```c

 

studentPtr->id = 20210001; // 구조체 멤버에 값 할당

 

strcpy(studentPtr->name, "John Doe");

 

```

 

구조체를 사용한 작업이 끝나면 `free()` 함수를 이용해 동적으로 할당된 메모리를 해제해야 한다.

 

```c

 

free(studentPtr); // 구조체 메모리 해제

 

```

 

 

 

4. 구조체 동적 할당 예제 코드

 

 

 

// 구조체 정의

 

typedef struct Student {

 

char name[30];

 

int age;

 

char major[50];

 

} Student;

 

int main() {

 

// 구조체 포인터 선언

 

Student* ptr_student = NULL;

 

// 구조체 동적 할당

 

ptr_student = (Student*)malloc(sizeof(Student));

 

// 구조체 멤버 값 설정

 

strcpy(ptr_student->name, "홍길동");

 

ptr_student->age = 20;

 

strcpy(ptr_student->major, "컴퓨터공학");

 

// 구조체 멤버 값 출력

 

printf("이름: %s ", ptr_student->name);

 

printf("나이: %d ", ptr_student->age);

 

printf("전공: %s ", ptr_student->major);

 

// 구조체 메모리 해제

 

free(ptr_student);

 

return 0;

 

}

 

 

 

5. 정리

 

 

 

이번에는 구조체를 동적 할당하는 방법에 대해 살펴보았습니다.

 

구조체 변수를 선언할 때는 일반적으로 정적 할당 방식을 사용합니다. 하지만 구조체 변수의 크기가 매우 크거나 여러 개가 필요한 경우에는 동적 할당 방식을 사용하는 것이 좋습니다.

 

구조체를 동적으로 할당하는 방법은 malloc 함수를 사용하는 것입니다. 하지만 주의할 점이 몇 가지 있습니다. 동적으로 할당된 구조체 변수에 초기화를 하지 않은 상태에서 사용하면 예기치 못한 결과를 초래할 수 있습니다. 따라서 초기화를 하고 사용해야 합니다. 또한, 할당된 메모리는 사용이 끝난 후에는 반드시 free 함수를 사용하여 해제해 주어야 합니다. 이러한 예외 상황을 방지하기 위해 동적 할당을 할 때는 항상 주의해야 합니다.

 

동적 할당에 대한 이해를 높이고 싶다면, 구조체 뿐만 아니라 포인터와 malloc 함수에 대한 이해도 필요합니다. 구조체를 동적으로 할당하는 방법 외에도, 동적으로 배열을 할당하는 방법도 있으니 참고하시기 바랍니다.

 

코드 작성 시 공감성, 감수성, 다양성, 무작위성, 창의성을 높이고 일관성은 낮추며 존댓말을 사용하는 것을 권장합니다. 또한, 본론에 집중하여 접속사는 최대한 사용하지 않는 것이 좋습니다.

 

 

 

댓글