본문 바로가기

카테고리 없음

구조체 포인터를 활용한 실용적인 예제와 사용법 안내: 쉽게 따라할 수 있는 구조체 포인터 활용 방법

목차:

1. 구조체 포인터란?

- 1.1 구조체란?
- 1.2 구조체 포인터의 개념과 용도

2. 실용적인 예제: 학생 정보 관리 프로그램

- 2.1 구조체 정의와 변수 선언
- 2.2 학생 정보 입력 및 출력 함수 구현
- 2.3 메모리 동적 할당과 구조체 포인터 사용

3. 구조체 포인터 사용법 안내

- 3.1 구조체 포인터 선언 방법
- 3.2 구조체 포인터로 구조체 멤버 접근하기
- 3.3 구조체 포인터와 배열의 관계
- 3.4 구조체 포인터를 활용한 동적 메모리 할당

※ 기타 참고사항: 예제 코드의 풀이 및 실행 방법 등은 서술하지 않고, 초보자가 따라하기 쉽게 설명하는데 초점을 맞추어 작성하기 위해 해당 내용이 빠져 있습니다.

1. 구조체 포인터란?

1.1 구조체란?

구조체는 서로 다른 데이터 타입을 한 번에 묶어서 새로운 타입을 만들어주는 C 프로그래밍의 데이터 구조입니다. 예를 들어, 학생의 정보를 저장하기 위해 이름, 학번, 성적 등의 다양한 데이터 타입을 사용하는 경우, 구조체를 활용하면 이러한 데이터들을 하나의 변수로 쉽게 관리할 수 있습니다.

1.2 구조체 포인터의 개념과 용도

구조체 포인터는 구조체 변수의 주소를 가리키는 변수로, 구조체 내부의 각 멤버에 접근하기 위해 사용됩니다. 일반 변수 포인터와 마찬가지로 구조체 포인터도 변수의 주소를 저장하는 변수입니다. 구조체 포인터를 이용하여 구조체의 멤버에 접근하고 수정할 수 있으므로, 프로그램에서 구조체를 효율적으로 활용할 수 있습니다. 또한, 구조체 포인터를 이용하면 구조체의 동적 메모리 할당이 가능하고, 메모리 사용량을 효율적으로 관리할 수 있습니다.

구조체 포인터의 사용 방법과 예제 코드는 아래에서 자세히 알아보겠습니다.

2. 실용적인 예제: 학생 정보 관리 프로그램

2.1 구조체 정의와 변수 선언

학생 정보 관리 프로그램을 만들기 위해 먼저 구조체를 정의하고 변수를 선언해야 합니다. 아래는 학생 정보를 저장하기 위한 구조체 정의와 변수 선언 예제입니다.

typedef struct {
    char name[20];
    int studentID;
    double grade;
} Student;

Student student1;
Student student2;

위 예제에서는 Student라는 구조체를 정의하고, name, studentID, grade라는 세 가지 멤버를 가지도록 했습니다. 구조체 내부의 멤버들은 각각 문자열 형태의 name, 정수형의 studentID, 실수형의 grade로 선언되었습니다. 그리고 Student 구조체로 student1student2라는 두 개의 변수를 선언하여 사용할 수 있도록 했습니다.

2.2 학생 정보 입력 및 출력 함수 구현

이제 학생 정보를 입력하고 출력하는 함수를 구현해보겠습니다. 아래 예제는 학생 정보를 입력받아 구조체에 저장하는 inputStudentInfo 함수와, 저장된 정보를 출력하는 printStudentInfo 함수입니다.

void inputStudentInfo(Student *student) {
    printf("이름을 입력하세요: ");
    scanf("%s", student->name);

    printf("학번을 입력하세요: ");
    scanf("%d", &(student->studentID));

    printf("성적을 입력하세요: ");
    scanf("%lf", &(student->grade));
}

void printStudentInfo(Student student) {
    printf("이름: %s\n", student.name);
    printf("학번: %d\n", student.studentID);
    printf("성적: %.1lf\n", student.grade);
}

inputStudentInfo 함수는 구조체 포인터 student를 매개변수로 받아 사용자로부터 이름, 학번, 성적을 입력받아 해당 구조체에 저장합니다. 입력은 scanf 함수를 이용하여 진행되며, 구조체 포인터 ->를 사용하여 구조체 멤버에 접근합니다.

printStudentInfo 함수는 구조체 변수 student를 매개변수로 받아 해당 구조체의 정보를 출력합니다. printf 함수를 사용하여 이름, 학번, 성적을 출력합니다.

2.3 메모리 동적 할당과 구조체 포인터 사용

이제 많은 학생 정보를 동적으로 관리하기 위해 구조체 포인터를 사용해보도록 하겠습니다. 아래 예제는 사용자로부터 학생 수를 입력받아 해당 수만큼 구조체 포인터를 동적으로 할당하는 예제입니다.

int main() {
    int numStudents;
    printf("학생 수를 입력하세요: ");
    scanf("%d", &numStudents);

    Student *students = (Student *)malloc(sizeof(Student) * numStudents);

    for (int i = 0; i < numStudents; i++) {
        printf("==== %d번째 학생 정보 ====\n", i + 1);
        inputStudentInfo(&students[i]);
    }

    for (int i = 0; i < numStudents; i++) {
        printf("==== %d번째 학생 정보 ====\n", i + 1);
        printStudentInfo(students[i]);
    }

    free(students);

    return 0;
}

main 함수에서는 사용자로부터 학생 수를 입력받고, 입력받은 수만큼 구조체 포인터를 동적으로 할당합니다. malloc 함수는 필요한 메모리 공간을 동적으로 할당하고, 할당한 메모리 주소를 반환합니다. 구조체 포인터 students에 해당 메모리 주소를 저장하여 학생 정보를 관리할 수 있도록 합니다.

그 후, inputStudentInfo 함수를 호출하여 입력받은 학생 수만큼 학생 정보를 입력받고, printStudentInfo 함수를 호출하여 저장된 학생 정보를 출력합니다.

마지막으로, 동적으로 할당한 메모리를 반환하기 위해 free 함수를 사용하여 메모리를 해제합니다.

이렇게 구현된 학생 정보 관리 프로그램은 사용자로부터 학생 수와 정보를 입력받아 저장하고, 입력된 정보를 출력하는 기능을 제공합니다. 구조체와 구조체 포인터의 사용법을 익히기에 좋은 예제입니다.

3. 구조체 포인터 사용법 안내

구조체 포인터는 구조체 변수의 주소를 가리키는 변수로, 구조체 내부의 각 멤버에 접근하기 위해 사용됩니다. 아래에서는 구조체 포인터의 사용법을 상세히 설명하겠습니다.

3.1 구조체 포인터 정의와 초기화

구조체 포인터를 정의하고 초기화하는 방법은 일반적인 포인터와 마찬가지로 진행됩니다. 구조체 포인터의 선언은 다음과 같이 구조체의 이름과 *를 함께 사용하여 이루어집니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person *personPtr;

위의 예제에서 Person이라는 구조체를 정의하고, personPtr라는 구조체 포인터를 선언했습니다.

구조체 포인터는 구조체 변수의 주소를 저장하기 때문에, 구조체 포인터를 사용하기 전에 반드시 초기화해야 합니다. 구조체 포인터를 초기화하는 방법은 다음과 같습니다.

Person *person = &personVar;

위의 예제에서 personVar은 구조체 변수입니다. & 연산자를 사용하여 구조체 변수 personVar의 주소를 구조체 포인터 person에 할당하여 초기화합니다.

3.2 구조체 멤버에 접근하기

구조체 포인터를 사용하여 구조체의 멤버에 접근하는 방법은 일반적인 포인터와 유사합니다. 구조체 포인터를 -> 연산자와 함께 사용하여 멤버에 접근할 수 있습니다.

아래의 예제는 구조체 포인터를 사용하여 구조체 멤버에 접근하는 방법을 보여줍니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person personVar;
Person *personPtr = &personVar;

personPtr->age = 25;
strcpy(personPtr->name, "John Doe");

위의 예제에서 personPtr은 구조체 포인터로, 구조체 변수 personVar의 주소를 가리킵니다.

personPtr->agepersonPtr->name을 사용하여 구조체 멤버에 접근하여 값을 할당하고, 문자열을 복사하는 등의 작업을 수행합니다. -> 연산자는 포인터가 가리키는 구조체 변수의 멤버에 접근할 때 사용됩니다.

3.3 구조체 포인터로 메모리 동적 할당하기

구조체 포인터를 사용하여 동적으로 메모리를 할당할 수도 있습니다. 메모리 동적 할당을 위해서는 malloc 함수를 사용합니다.

아래 예제는 구조체 포인터를 사용하여 메모리를 동적으로 할당하는 방법을 보여줍니다.

typedef struct {
    int age;
    char name[20];
} Person;

int main() {
    Person *personPtr = (Person *)malloc(sizeof(Person));

    if (personPtr == NULL) {
        printf("메모리 할당 오류\n");
        return -1;
    }

    personPtr->age = 25;
    strcpy(personPtr->name, "John Doe");

    free(personPtr);

    return 0;
}

위의 예제에서 personPtr은 구조체 포인터로, malloc 함수를 사용하여 Person 구조체 크기만큼 메모리 공간을 동적으로 할당받습니다. 할당받은 메모리의 주소를 personPtr에 저장하여 구조체 멤버에 접근할 수 있습니다.

malloc 함수의 반환 값이 NULL인지 확인하여 메모리 할당이 제대로 이루어졌는지 확인할 수 있습니다. 메모리 할당이 제대로 이루어지지 않았을 경우 해당 상황에 대한 예외 처리를 해주어야 합니다.

마지막으로, 메모리를 해제하기 위해 free 함수를 사용하여 동적으로 할당된 메모리를 해제합니다.

이렇게 구조체 포인터를 사용하여 구조체의 멤버에 접근하고, 메모리를 동적으로 할당하는 방법을 알아보았습니다. 이러한 구조체 포인터의 활용은 구조체를 효율적으로 관리하고 다양한 작업을 수행할 수 있도록 도와줍니다.

구조체 포인터 사용법 안내

구조체 포인터는 구조체 변수의 주소를 가리키는 변수로, 구조체 내부의 각 멤버에 접근하기 위해 사용됩니다.

구조체 포인터 정의와 초기화

구조체 포인터를 정의하고 초기화하는 방법은 일반적인 포인터와 마찬가지로 진행됩니다. 구조체 포인터의 선언은 다음과 같이 구조체의 이름과 *를 함께 사용하여 이루어집니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person *personPtr;

위의 예제에서 Person이라는 구조체를 정의하고, personPtr라는 구조체 포인터를 선언했습니다.

구조체 포인터는 구조체 변수의 주소를 저장하기 때문에, 구조체 포인터를 사용하기 전에 반드시 초기화해야 합니다. 구조체 포인터를 초기화하는 방법은 다음과 같습니다.

Person *person = &personVar;

위의 예제에서 personVar은 구조체 변수입니다. & 연산자를 사용하여 구조체 변수 personVar의 주소를 구조체 포인터 person에 할당하여 초기화합니다.

구조체 멤버에 접근하기

구조체 포인터를 사용하여 구조체의 멤버에 접근하는 방법은 일반적인 포인터와 유사합니다. 구조체 포인터를 -> 연산자와 함께 사용하여 멤버에 접근할 수 있습니다.

아래의 예제는 구조체 포인터를 사용하여 구조체 멤버에 접근하는 방법을 보여줍니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person personVar;
Person *personPtr = &personVar;

personPtr->age = 25;
strcpy(personPtr->name, "John Doe");

위의 예제에서 personPtr은 구조체 포인터로, 구조체 변수 personVar의 주소를 가리킵니다.

personPtr->agepersonPtr->name을 사용하여 구조체 멤버에 접근하여 값을 할당하고, 문자열을 복사하는 등의 작업을 수행합니다. -> 연산자는 포인터가 가리키는 구조체 변수의 멤버에 접근할 때 사용됩니다.

구조체 포인터로 메모리 동적 할당하기

구조체 포인터를 사용하여 동적으로 메모리를 할당할 수도 있습니다. 메모리 동적 할당을 위해서는 malloc 함수를 사용합니다.

아래 예제는 구조체 포인터를 사용하여 메모리를 동적으로 할당하는 방법을 보여줍니다.

typedef struct {
    int age;
    char name[20];
} Person;

int main() {
    Person *personPtr = (Person *)malloc(sizeof(Person));

    if (personPtr == NULL) {
        printf("메모리 할당 오류\n");
        return -1;
    }

    personPtr->age = 25;
    strcpy(personPtr->name, "John Doe");

    free(personPtr);

    return 0;
}

위의 예제에서 personPtr은 구조체 포인터로, malloc 함수를 사용하여 Person 구조체 크기만큼 메모리 공간을 동적으로 할당받습니다. 할당받은 메모리의 주소를 personPtr에 저장하여 구조체 멤버에 접근할 수 있습니다.

malloc 함수의 반환 값이 NULL인지 확인하여 메모리 할당이 제대로 이루어졌는지 확인할 수 있습니다. 메모리 할당이 제대로 이루어지지 않았을 경우 해당 상황에 대한 예외 처리를 해주어야 합니다.

마지막으로, 메모리를 해제하기 위해 free 함수를 사용하여 동적으로 할당된 메모리를 해제합니다.

이렇게 구조체 포인터를 사용하여 구조체의 멤버에 접근하고, 메모리를 동적으로 할당하는 방법을 알아보았습니다. 이러한 구조체 포인터의 활용은 구조체를 효율적으로 관리하고 다양한 작업을 수행할 수 있도록 도와줍니다.

1. 구조체 포인터란?

구조체 포인터는 C 프로그래밍에서 구조체 변수의 주소를 가리키는 데이터 타입입니다. 구조체는 여러 개의 변수를 묶어서 하나의 논리적인 단위로 사용하기 위해 선언되는 데이터 타입입니다. 구조체 멤버들은 다른 데이터 타입을 가질 수 있습니다.

구조체 포인터는 구조체 변수의 주소를 저장하기 위해 사용되며, 구조체의 개별 멤버에 접근하는 데 사용됩니다. 구조체 멤버에 접근하는 데에는 . 연산자를 사용할 수도 있지만, 구조체 포인터를 사용하면 -> 연산자를 사용하여 구조체 멤버에 접근할 수 있습니다.

구조체 포인터를 사용하면 구조체 변수를 효율적으로 다룰 수 있으며, 동적 메모리 할당과 같은 고급 기능에도 활용됩니다.

구조체 포인터를 정의하고 접근하는 방법은 다음과 같습니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person personVar;    // 구조체 변수 선언
Person *personPtr;   // 구조체 포인터 선언

personPtr = &personVar;     // 구조체 변수의 주소로 초기화

personPtr->age = 25;                    // 구조체 멤버에 접근하여 값 할당
strcpy(personPtr->name, "John Doe");     // 구조체 멤버에 문자열 복사

구조체 포인터를 사용하여 구조체 변수의 주소를 저장하고, 구조체 멤버에 접근하여 값을 할당하거나 복사할 수 있습니다. 이를 통해 구조체를 유연하고 효율적으로 활용할 수 있습니다.

1.1 구조체란?

구조체(Structure)는 C 프로그래밍에서 다양한 데이터 타입을 묶어 하나의 논리적인 단위로 사용하기 위해 선언되는 데이터 타입입니다. 구조체는 여러 개의 변수로 이루어져 있으며, 각 변수는 자신의 데이터 타입을 가질 수 있습니다. 이렇게 구조체를 사용하면 관련된 데이터들을 하나로 묶어서 효율적으로 관리하고 조작할 수 있습니다.

구조체는 다음과 같이 선언됩니다.

struct 구조체이름 {
    데이터타입 멤버1;
    데이터타입 멤버2;
    //...
};

구조체는 struct 키워드를 사용하여 정의하며, 구조체의 이름은 사용자가 임의로 지정합니다. 구조체 내부에는 데이터 타입과 변수 이름을 콜론으로 구분하여 멤버로 정의합니다.

구조체를 선언하면 해당 구조체를 사용하여 변수를 선언할 수 있습니다. 예를 들어, 다음과 같이 구조체를 정의하고 변수를 선언할 수 있습니다.

struct Person {  // 구조체 정의
    int age;
    char name[20];
};

struct Person person1, person2;  // 구조체 변수 선언

위의 예제에서 Person이라는 구조체를 정의하고, person1person2라는 구조체 변수를 선언했습니다. 이렇게 구조체 변수를 선언하면, 해당 구조체 변수에 각각의 멤버 변수가 생성되어 사용할 수 있습니다.

구조체 멤버에 접근할 때는 . 연산자를 사용하여 멤버 변수에 접근할 수 있습니다. 예를 들어, person1.age와 같이 구조체 변수와 멤버 이름을 . 연산자로 연결하여 사용합니다.

구조체는 비슷한 종류의 데이터를 함께 묶어서 처리해야 할 때 유용하게 사용됩니다. 예를 들어, 여러 개의 학생 데이터를 관리하는 프로그램에서 각 학생의 정보를 구조체로 정의하여 한 번에 관리할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

1.2 구조체 포인터의 개념과 용도

구조체 포인터(Structure Pointer)는 C 프로그래밍에서 구조체 변수의 주소를 가리키는 데이터 타입입니다. 포인터는 변수의 주소를 저장하고, 해당 변수에 접근하는 데 사용됩니다. 구조체 포인터는 구조체 변수를 효율적으로 다룰 수 있도록 도와줍니다.

구조체 포인터는 다음과 같이 선언됩니다.

struct 구조체이름 *포인터이름;

구조체 포인터를 사용하면 해당 구조체 변수의 주소를 저장하고, 구조체의 멤버에 접근할 수 있습니다. 구조체 멤버에 접근하는 데에는 . 연산자를 사용할 수도 있지만, 구조체 포인터를 사용하면 -> 연산자를 사용하여 구조체 멤버에 접근할 수 있습니다.

구조체 포인터를 사용하는 가장 일반적인 용도는 동적 메모리 할당 입니다. 동적 메모리 할당은 프로그램이 실행 중에 메모리를 할당하는 것을 말합니다. 구조체 포인터를 사용하여 동적으로 구조체 변수를 생성할 수 있으며, 이는 프로그램의 유연성과 효율성을 높일 수 있습니다.

다음은 구조체 포인터를 사용하여 구조체를 동적으로 할당하는 예시입니다.

typedef struct {
    int age;
    char name[20];
} Person;

Person *personPtr;  // 구조체 포인터 선언

personPtr = (Person*)malloc(sizeof(Person));  // 구조체 동적 할당

if (personPtr != NULL) {
    personPtr->age = 25;                    // 구조체 멤버에 접근하여 값 할당
    strcpy(personPtr->name, "John Doe");     // 구조체 멤버에 문자열 복사
}

위의 예제에서는 Person이라는 구조체를 정의하고, personPtr이라는 구조체 포인터를 선언했습니다. 이후에 malloc() 함수를 사용하여 동적으로 구조체 변수를 할당하고, personPtr을 통해 해당 구조체 멤버에 접근하여 값을 할당하거나 복사합니다.

구조체 포인터는 구조체 변수에 대한 간접적인 접근을 제공하므로, 구조체를 효율적으로 다룰 수 있습니다. 또한, 동적 메모리 할당과 같은 고급 기능에도 활용됩니다.

1.2 구조체 포인터의 개념과 용도

구조체 포인터(Structure Pointer)는 C 프로그래밍에서 구조체 변수의 주소를 가리키는 데이터 타입입니다. 이는 변수의 주소를 저장하고 해당 변수에 접근하는 데에 사용됩니다. 구조체 포인터를 사용하면 구조체 변수를 효율적으로 관리할 수 있습니다.

구조체 포인터는 다음과 같이 선언됩니다.

struct 구조체이름 *포인터이름;

구조체 포인터를 사용하면 해당 구조체 변수의 주소를 저장하고, 구조체의 멤버에 접근할 수 있습니다. 구조체 멤버에 접근하는 데에는 . 연산자를 사용할 수도 있지만, 구조체 포인터를 사용하면 -> 연산자를 사용하여 구조체 멤버에 접근할 수 있습니다.

구조체 포인터를 사용하는 가장 일반적인 용도는 동적 메모리 할당입니다. 동적 메모리 할당은 프로그램이 실행 중에 메모리를 할당하는 것을 의미합니다. 구조체 포인터를 사용하여 동적으로 구조체 변수를 생성할 수 있으며, 이는 프로그램의 유연성과 효율성을 높일 수 있습니다.

아래의 예시를 통해 구조체 포인터의 개념과 용도를 살펴봅시다.

typedef struct {
    int age;
    char name[20];
} Person;

Person *personPtr;  // 구조체 포인터 선언

personPtr = (Person*)malloc(sizeof(Person));  // 구조체 동적 할당

if (personPtr != NULL) {
    personPtr->age = 25;                    // 구조체 멤버에 접근하여 값 할당
    strcpy(personPtr->name, "John Doe");     // 구조체 멤버에 문자열 복사
}

위의 예시에서는 Person이라는 구조체를 정의하고, personPtr이라는 구조체 포인터를 선언했습니다. malloc() 함수를 사용하여 구조체 변수를 동적으로 할당하고, personPtr을 통해 해당 구조체 멤버에 접근하여 값을 할당하거나 복사하였습니다.

구조체 포인터는 구조체 변수에 대한 간접적인 접근을 제공하므로 구조체를 효율적으로 다룰 수 있습니다. 또한, 동적 메모리 할당과 같은 고급 기능에도 활용될 수 있습니다. 이를 통해 프로그램의 가독성과 유지보수성을 향상시킬 수 있습니다.

2. 실용적인 예제: 학생 정보 관리 프로그램

이번에는 구조체 포인터를 사용하여 학생 정보를 관리하는 프로그램을 만들어보겠습니다. 이 프로그램은 학생의 이름, 학번, 학과, 학점을 저장하고 출력하는 기능을 가지고 있습니다.

먼저, 다음과 같이 학생 정보를 저장할 구조체를 정의합니다.

typedef struct {
    char name[20];
    int studentId;
    char major[20];
    float GPA;
} Student;

위의 예시에서는 Student라는 구조체를 정의하고, 학생의 이름(name), 학번(studentId), 학과(major), 학점(GPA)을 멤버로 포함시켰습니다.

이제, 학생 정보를 입력받고 출력하는 프로그램을 작성해보겠습니다.

#include <stdlib.h>
#include <stdio.h>

int main() {
    int numStudents;
    printf("학생의 수를 입력하세요: ");
    scanf("%d", &numStudents);

    Student *students = malloc(numStudents * sizeof(Student));

    for (int i = 0; i < numStudents; i++) {
        printf("\n\n%d번째 학생\n", i + 1);

        printf("이름: ");
        scanf("%s", students[i].name);

        printf("학번: ");
        scanf("%d", &students[i].studentId);

        printf("학과: ");
        scanf("%s", students[i].major);

        printf("학점: ");
        scanf("%f", &students[i].GPA);
    }

    printf("\n\n입력된 학생 정보\n");
    for (int i = 0; i < numStudents; i++) {
        printf("\n%d번째 학생\n", i + 1);
        printf("이름: %s\n", students[i].name);
        printf("학번: %d\n", students[i].studentId);
        printf("학과: %s\n", students[i].major);
        printf("학점: %.2f\n", students[i].GPA);
    }

    free(students);

    return 0;
}

위의 예시에서는 사용자로부터 입력받은 학생의 수(numStudents)를 통해 동적으로 Student 구조체를 할당받고, 각 학생 정보를 입력받습니다.

입력이 완료되면, 입력된 학생 정보를 화면에 출력합니다.

프로그램의 실행 결과는 다음과 같습니다:

학생의 수를 입력하세요: 3


1번째 학생
이름: John
학번: 20210001
학과: Computer Science
학점: 3.5


2번째 학생
이름: Jane
학번: 20210002
학과: Electrical Engineering
학점: 3.8


3번째 학생
이름: Mike
학번: 20210003
학과: Mathematics
학점: 3.2


입력된 학생 정보

1번째 학생
이름: John
학번: 20210001
학과: Computer Science
학점: 3.50

2번째 학생
이름: Jane
학번: 20210002
학과: Electrical Engineering
학점: 3.80

3번째 학생
이름: Mike
학번: 20210003
학과: Mathematics
학점: 3.20

이 예시에서는 구조체 포인터를 사용하여 학생 정보를 관리하는 학생 정보 관리 프로그램을 구현하였습니다. 사용자로부터 학생의 수를 입력받고, 동적으로 메모리를 할당해 각 학생 정보를 저장합니다. 이후, 입력된 학생 정보를 화면에 출력하는 기능을 제공합니다. 프로그램을 통해 학생들의 정보를 관리할 수 있게 되었습니다.

2.1 구조체 정의와 변수 선언

이번 예제에서는 학생 정보를 저장하는 구조체를 정의하고, 해당 구조체를 사용하여 변수를 선언하는 방법을 알아보겠습니다.

구조체는 관련있는 데이터를 하나의 자료형으로 묶어줄 수 있는 선언이며, 구조체 멤버는 다양한 데이터 타입을 가질 수 있습니다.

아래의 예시에서는 학생 정보를 저장하기 위한 구조체를 정의할 것입니다.

typedef struct {
    char name[20];
    int studentId;
    char major[20];
    float GPA;
} Student;

위의 예시에서는 Student라는 구조체를 정의했습니다. 이 구조체는 학생의 이름(name), 학번(studentId), 학과(major), 그리고 학점(GPA)을 멤버로 가지고 있습니다.

구조체 멤버는 각각의 데이터 타입을 가질 수 있기 때문에, 이름은 문자열(char 배열), 학번은 정수(int), 학과는 문자열(char 배열), 학점은 부동소수점(float)으로 정의되었습니다.

이제 구조체를 사용하여 변수를 선언해보겠습니다.

Student student1;
Student student2;

위의 예시에서는 Student 구조체를 사용하여 student1student2라는 변수를 선언했습니다. 이 변수들은 각각 Student 구조체의 멤버들을 포함하게 됩니다.

이제 Student 구조체의 멤버에 값을 할당하고 접근하는 것이 가능합니다.

strcpy(student1.name, "John");
student1.studentId = 20210001;
strcpy(student1.major, "Computer Science");
student1.GPA = 3.5;

위의 예시에서는 strcpy() 함수를 사용하여 student1의 이름 멤버에 "John"이라는 문자열을 할당하고, 학번 멤버에 20210001을 할당하였습니다. 또한, strcpy() 함수를 사용하여 학과 멤버에 "Computer Science"라는 문자열을 할당하고, 학점 멤버에 3.5를 할당하였습니다.

구조체 변수에 할당된 값에 접근하는 것도 가능합니다.

printf("이름: %s\n", student1.name);
printf("학번: %d\n", student1.studentId);
printf("학과: %s\n", student1.major);
printf("학점: %.2f\n", student1.GPA);

위의 예시에서는 printf() 함수를 사용하여 student1 구조체의 멤버에 접근하여 값을 출력했습니다.

이렇게 구조체를 정의하고 변수를 선언함으로써, 학생 정보를 표현하고 관리할 수 있는 기반을 구축했습니다. 구조체를 사용하면 여러 데이터를 하나의 논리적 개체로 관리할 수 있으며, 이는 프로그램의 효율성과 가독성을 높여줍니다.

2.2 학생 정보 입력 및 출력 함수 구현

이번 예제에서는 구조체를 사용하여 학생 정보를 입력받고 출력하는 함수를 구현해보겠습니다.

우선, 학생 정보를 입력받는 함수를 작성하겠습니다.

void inputStudentInfo(Student *student) {
    printf("이름: ");
    scanf("%s", student->name);

    printf("학번: ");
    scanf("%d", &student->studentId);

    printf("학과: ");
    scanf("%s", student->major);

    printf("학점: ");
    scanf("%f", &student->GPA);
}

위의 예시에서는 inputStudentInfo라는 함수를 정의했습니다. 이 함수는 Student 구조체 포인터(Student *student)를 매개변수로 받습니다.

함수 내에서는 printf() 함수를 사용하여 사용자로부터 학생의 이름, 학번, 학과, 학점을 입력받습니다. 입력은 scanf() 함수를 통해 이루어지며, 입력된 값을 구조체 포인터의 멤버들에 할당합니다.

다음으로, 학생 정보를 출력하는 함수를 구현하겠습니다.

void printStudentInfo(Student *student) {
    printf("이름: %s\n", student->name);
    printf("학번: %d\n", student->studentId);
    printf("학과: %s\n", student->major);
    printf("학점: %.2f\n", student->GPA);
}

위의 예시에서는 printStudentInfo라는 함수를 정의했습니다. 이 함수는 Student 구조체 포인터(Student *student)를 매개변수로 받습니다.

함수 내에서는 printf() 함수를 사용하여 구조체 포인터의 멤버들에 접근하여 값들을 출력합니다.

이제, 위에서 작성한 함수들을 활용하여 학생 정보를 입력받고 출력하는 기능을 제공하는 메인 함수를 작성하겠습니다.

int main() {
    Student student1;
    Student student2;

    printf("1번째 학생 정보 입력\n");
    inputStudentInfo(&student1);

    printf("\n2번째 학생 정보 입력\n");
    inputStudentInfo(&student2);

    printf("\n입력된 학생 정보\n");
    printf("1번째 학생\n");
    printStudentInfo(&student1);

    printf("\n2번째 학생\n");
    printStudentInfo(&student2);

    return 0;
}

위의 예시에서는 main() 함수 내에서 Student 구조체를 사용하여 student1student2라는 변수를 선언했습니다.

inputStudentInfo() 함수를 통해 student1student2의 정보를 입력받고, printStudentInfo() 함수를 통해 입력된 학생 정보를 출력합니다.

프로그램을 실행하면 아래와 같은 결과가 출력됩니다.

1번째 학생 정보 입력
이름: John
학번: 20210001
학과: Computer Science
학점: 3.5

2번째 학생 정보 입력
이름: Jane
학번: 20210002
학과: Electrical Engineering
학점: 3.8

입력된 학생 정보
1번째 학생
이름: John
학번: 20210001
학과: Computer Science
학점: 3.50

2번째 학생
이름: Jane
학번: 20210002
학과: Electrical Engineering
학점: 3.80

이렇게 구현된 함수들을 통해 학생 정보를 입력받고 출력할 수 있게 되었습니다. 입력 함수는 구조체 포인터를 통해 입력된 정보를 구조체 멤버에 할당하고, 출력 함수는 구조체 포인터를 통해 멤버에 접근하여 정보를 출력합니다. 이는 학생 정보 관리 프로그램을 구현하는 데 유용한 기능입니다.

2.3 메모리 동적 할당과 구조체 포인터 사용

이번 예제에서는 메모리 동적 할당을 통해 구조체 포인터를 사용하는 방법을 알아보겠습니다.

구조체 포인터를 사용하여 동적으로 메모리를 할당하면, 프로그램 실행 중에 필요한 만큼의 메모리를 할당할 수 있으며, 필요없어지면 해제할 수도 있습니다.

먼저, 동적으로 메모리를 할당하는 방법을 알아보겠습니다.

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

위의 예시에서는 malloc() 함수를 사용하여 Student 구조체 크기만큼 메모리를 할당했습니다. 그리고 미리 정의된 Student 구조체의 포인터(Student *student)에 할당된 메모리의 주소를 저장합니다.

이제 구조체 포인터를 사용하여 멤버에 접근하여 값을 할당할 수 있습니다.

strcpy(student->name, "John");
student->studentId = 20210001;
strcpy(student->major, "Computer Science");
student->GPA = 3.5;

위의 예시에서는 strcpy() 함수를 사용하여 student의 이름 멤버에 "John"이라는 문자열을 할당하고, 학번 멤버에 20210001을 할당하였습니다. 또한, strcpy() 함수를 사용하여 학과 멤버에 "Computer Science"라는 문자열을 할당하고, 학점 멤버에 3.5를 할당하였습니다.

동적으로 할당된 메모리를 해제하는 방법도 있습니다.

free(student);

위의 예시에서는 free() 함수를 사용하여 student가 가리키는 동적으로 할당된 메모리를 해제합니다.

동적으로 할당된 메모리를 사용하고 해제할 수 있는 메모리 관리 기능은 유용합니다. 특히, 프로그램이 실행 중에 필요한 만큼의 메모리를 할당하고 해제할 수 있다는 점에서 매우 유연한 기능입니다. 메모리 동적 할당을 사용하면 메모리의 효율성을 높일 수 있고, 더 유연하게 프로그램을 작성할 수 있습니다.

2.3 메모리 동적 할당과 구조체 포인터 사용

메모리 동적 할당과 구조체 포인터를 활용하여 프로그램 실행 중에 필요한 만큼의 메모리를 할당하고 해제할 수 있는 방법에 대해 알아보겠습니다.

동적 메모리 할당

메모리 동적 할당을 위해서는 malloc() 함수를 사용합니다. malloc() 함수는 할당할 메모리의 크기(바이트 단위)를 인자로 받고, 할당된 메모리의 시작 주소를 반환합니다.

아래의 예시는 Student 구조체 크기만큼 메모리를 동적으로 할당하는 방법을 보여줍니다.

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

위의 예시에서 sizeof(Student)를 통해 Student 구조체의 크기를 구한 다음, malloc() 함수를 사용하여 해당 크기만큼의 메모리를 할당합니다. 그리고 Student 구조체 포인터인 student에 할당된 메모리의 시작 주소를 저장합니다.

구조체 포인터를 사용하여 값 할당

동적으로 할당된 메모리를 사용하기 위해 구조체 포인터를 활용합니다. 구조체 포인터를 사용하여 멤버에 접근하여 값을 할당할 수 있습니다.

예를 들어, 아래의 예시는 student 구조체 포인터를 사용하여 구조체 멤버에 값을 할당하는 방법입니다.

strcpy(student->name, "John");
student->studentId = 20210001;
strcpy(student->major, "Computer Science");
student->GPA = 3.5;

위의 예시에서는 strcpy() 함수를 사용하여 studentname 멤버에 "John"이라는 문자열을 할당하고, studentId 멤버에 20210001을 할당하였습니다. 또한, strcpy() 함수를 사용하여 major 멤버에 "Computer Science"라는 문자열을 할당하고, GPA 멤버에 3.5를 할당하였습니다.

동적 메모리 해제

동적으로 할당된 메모리는 사용이 끝나면 해제해주어야 합니다. 이를 위해 free() 함수를 사용합니다.

아래의 예시는 student가 가리키는 동적으로 할당된 메모리를 해제하는 방법을 보여줍니다.

free(student);

위의 예시에서 free() 함수를 사용하여 student가 가리키는 동적으로 할당된 메모리를 해제합니다.

메모리 동적 할당을 사용하면 실행 중에 필요한 만큼의 메모리를 할당하고 해제할 수 있습니다. 이는 메모리의 효율성을 높여줄 뿐만 아니라 프로그램의 유연성을 높여줍니다. 동적 메모리 할당은 프로그램을 작성할 때 메모리 사용과 관리를 더욱 유연하게 할 수 있는 강력한 기능입니다.

3. 구조체 포인터 사용법 안내

구조체 포인터를 사용하여 구조체의 멤버에 접근하고 값을 할당하는 방법에 대해 알아보겠습니다. 이를테면 Student라는 구조체를 예시로 사용하도록 하겠습니다.

구조체 포인터 선언

구조체 포인터를 사용하기 위해서는 먼저 해당 구조체의 포인터를 선언해야 합니다. 포인터 변수의 이름은 사용자가 원하는 대로 지을 수 있습니다.

Student *studentPtr;

위의 예시에서 Student 구조체 포인터인 studentPtr을 선언하였습니다.

동적 메모리 할당 및 구조체 포인터에 할당된 메모리 주소 저장

구조체 포인터를 사용하여 동적으로 메모리를 할당하고, 할당된 메모리의 주소를 구조체 포인터에 저장할 수 있습니다. 이를 위해 malloc() 함수를 사용합니다.

studentPtr = malloc(sizeof(Student));

위의 예시에서 malloc() 함수를 사용하여 Student 구조체 크기만큼의 메모리를 동적으로 할당하였습니다. 그리고 studentPtr 포인터에 할당된 메모리의 시작 주소를 저장합니다.

구조체 포인터를 사용하여 멤버에 접근하고 값을 할당

동적으로 할당된 메모리를 사용하기 위해 구조체 포인터를 활용합니다. 구조체 포인터는 화살표(->) 연산자를 사용하여 멤버에 접근할 수 있습니다.

아래의 예시는 구조체 포인터를 사용하여 name 멤버에 문자열을 할당하는 방법을 보여줍니다.

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

위의 예시에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다.

구조체 포인터를 사용하여 다른 멤버에도 접근하고 값을 할당할 수 있습니다. 예를 들어, studentId 멤버에 값을 할당하는 방법은 아래와 같습니다.

studentPtr->studentId = 20210001;

위의 예시에서는 studentPtr이 가리키는 구조체의 studentId 멤버에 20210001을 할당합니다.

동적 메모리 해제

동적으로 할당된 메모리는 더 이상 사용하지 않을 때 해제해주어야 합니다. 예약된 메모리를 해제하기 위해 free() 함수를 사용합니다.

free(studentPtr);

위의 예시에서는 free() 함수를 사용하여 studentPtr이 가리키는 동적으로 할당된 메모리를 해제합니다.

구조체 포인터를 사용하여 구조체의 멤버에 접근하고 값을 할당하는 방법을 통해 동적으로 메모리를 할당하고 사용할 수 있습니다. 이를 통해 프로그램이 실행 중에 필요한 만큼의 메모리를 유연하게 관리할 수 있습니다.

3.1 구조체 포인터 선언 방법

구조체 포인터를 선언하는 방법에 대해 자세히 알아보겠습니다. 구조체 포인터를 사용하면 구조체의 멤버에 접근하고 값을 할당할 수 있습니다. 먼저, 구조체 포인터 변수를 선언해야 합니다.

구조체 포인터 변수 선언

구조체 포인터 변수는 일반적인 포인터 변수와 마찬가지로 선언할 수 있습니다. 포인터 변수의 이름은 사용자가 원하는 대로 지을 수 있습니다.

Student *studentPtr;

위의 예시에서 Student 구조체 포인터인 studentPtr을 선언하였습니다. 이제 studentPtrStudent 구조체 변수를 가리키기 위한 포인터로 사용될 수 있습니다.

구조체 포인터를 선언하면 해당 포인터가 Student 구조체 변수를 가리킬 수 있는 준비가 된 것입니다. 이제는 구조체 포인터를 사용하여 구조체의 멤버에 접근하고 값을 할당할 수 있습니다.

3.2 구조체 포인터로 구조체 멤버 접근하기

구조체 포인터를 사용하여 메모리에 동적으로 할당된 구조체의 멤버에 접근하고 값을 할당하는 방법에 대해 알아보겠습니다.

동적 메모리 할당 및 구조체 포인터에 할당된 메모리 주소 저장

먼저, 구조체 포인터를 사용하기 위해 동적으로 구조체 크기만큼의 메모리를 할당해야 합니다. 이를 위해 malloc() 함수를 사용합니다.

studentPtr = malloc(sizeof(Student));

위의 예시에서는 Student 구조체 크기만큼의 메모리를 동적으로 할당하고, studentPtr 포인터에 할당된 메모리의 시작 주소를 저장합니다. 이제 studentPtr은 동적으로 할당된 메모리를 가리키는 포인터로 사용될 수 있습니다.

구조체 포인터를 사용하여 멤버에 접근하고 값을 할당

구조체 포인터를 사용하여 동적으로 할당된 메모리를 활용할 수 있습니다. 구조체 포인터는 화살표(->) 연산자를 사용하여 구조체의 멤버에 접근할 수 있습니다.

예를 들어, name 멤버에 문자열을 할당하려면 다음과 같이 구조체 포인터를 사용할 수 있습니다.

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

위의 예시에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다.

구조체 포인터를 사용하여 다른 멤버에도 접근하고 값을 할당할 수 있습니다. 예를 들어, studentId 멤버에 값을 할당하는 방법은 아래와 같습니다.

studentPtr->studentId = 20210001;

위의 예시에서는 studentPtr이 가리키는 구조체의 studentId 멤버에 20210001을 할당합니다.

동적 메모리 해제

동적으로 할당된 메모리는 더 이상 사용하지 않을 때 해제해주어야 합니다. 예약된 메모리를 해제하기 위해 free() 함수를 사용합니다.

free(studentPtr);

위의 예시에서는 free() 함수를 사용하여 studentPtr이 가리키는 동적으로 할당된 메모리를 해제합니다.

구조체 포인터를 사용하여 구조체의 멤버에 접근하고 값을 할당하는 방법을 통해 동적으로 메모리를 할당하고 사용할 수 있습니다. 이를 통해 프로그램이 실행 중에 필요한 만큼의 메모리를 유연하게 관리할 수 있습니다.

3.3 구조체 포인터와 배열의 관계

구조체 포인터와 배열은 서로 밀접한 관계를 가지고 있습니다. 구조체 포인터를 사용하여 배열의 요소에 접근하고 값을 할당할 수 있습니다. 이를 통해 구조체 배열을 유연하게 다룰 수 있습니다.

구조체 배열 선언

먼저, 구조체 배열을 선언해야 합니다. 구조체 배열은 여러 개의 구조체 요소로 이루어져 있으며, 각 요소는 동일한 구조체 타입을 가지고 있습니다.

다음은 Student 구조체를 요소로 가지는 구조체 배열 students를 선언한 예시입니다. 배열의 크기는 3으로 지정되었습니다.

Student students[3];

위의 예시에서 studentsStudent 구조체를 요소로 가지는 배열입니다. 배열은 students[0], students[1], students[2]와 같은 인덱스로 각 요소에 접근할 수 있습니다.

구조체 포인터와 배열의 관계

구조체 배열은 메모리에 연속적으로 할당되므로, 구조체 배열의 첫 번째 요소의 주소는 배열의 이름과 동일합니다. 이를 구조체 포인터에 저장하여 구조체 배열의 첫 번째 요소에 대한 포인터로 활용할 수 있습니다.

다음은 구조체 배열 students의 첫 번째 요소에 대한 구조체 포인터 studentPtr을 선언한 예시입니다.

Student *studentPtr = &students[0];

위의 예시에서 studentPtrstudents 배열의 첫 번째 요소에 대한 포인터로 지정되어 있습니다. 이제 studentPtr을 사용하여 구조체의 멤버에 접근하고 값을 할당할 수 있습니다.

구조체 포인터를 사용하여 배열 요소에 접근 및 할당

구조체 포인터를 사용하여 배열 요소에 접근하고 값을 할당하는 방법은 포인터 연산과 유사합니다. 구조체 포인터를 사용하여 배열 요소에 접근하려면 화살표(->) 연산자를 사용해야 합니다.

예를 들어, studentPtr을 사용하여 students 배열의 첫 번째 요소인 students[0]name 멤버에 접근하고 값을 할당하는 방법은 아래와 같습니다.

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

위의 예시에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다.

구조체 포인터와 배열은 서로 밀접한 관계를 가지며, 구조체 포인터를 사용하여 배열의 요소에 접근하고 값을 할당할 수 있습니다. 이를 통해 구조체 배열을 효율적으로 활용할 수 있습니다.

3.4 구조체 포인터를 활용한 동적 메모리 할당

구조체 포인터를 사용하여 동적으로 메모리를 할당하는 방법을 알아보겠습니다. 동적 메모리 할당을 통해 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있습니다.

동적 메모리 할당 및 구조체 포인터에 할당된 메모리 주소 저장

동적으로 메모리를 할당하기 위해서는 malloc() 함수를 사용해야 합니다. malloc() 함수를 사용하여 구조체의 크기만큼의 메모리를 할당한 후, 구조체 포인터에 할당된 메모리의 시작 주소를 저장합니다.

다음은 Student 구조체에 대한 메모리를 동적으로 할당하고, 그 주소를 구조체 포인터 studentPtr에 저장하는 예시입니다.

studentPtr = malloc(sizeof(Student));

위의 예시에서 malloc() 함수를 사용하여 Student 구조체의 크기만큼의 메모리를 할당하고, studentPtr 포인터에 할당된 메모리의 시작 주소를 저장합니다.

구조체 포인터를 사용하여 멤버에 접근하고 값을 할당

구조체 포인터를 사용하여 동적으로 할당된 메모리를 활용할 수 있습니다. 구조체 포인터는 화살표(->) 연산자를 사용하여 구조체의 멤버에 접근할 수 있습니다.

예를 들어, studentPtr를 사용하여 동적으로 할당된 메모리의 name 멤버에 값을 할당하는 방법은 다음과 같습니다.

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

위의 예시에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다.

구조체 포인터를 사용하여 다른 멤버에도 접근하고 값을 할당할 수 있습니다. 예를 들어, studentPtr이 가리키는 구조체의 studentId 멤버에 값을 할당하는 방법은 아래와 같습니다.

studentPtr->studentId = 20210001;

위의 예시에서는 studentPtr이 가리키는 구조체의 studentId 멤버에 20210001을 할당합니다.

동적 메모리 해제

동적으로 할당된 메모리를 더 이상 사용하지 않을 때에는 해제해주어야 합니다. 메모리를 해제하기 위해 free() 함수를 사용합니다.

다음은 studentPtr이 가리키는 동적으로 할당된 메모리를 해제하는 예시입니다.

free(studentPtr);

위의 예시에서 free() 함수를 사용하여 studentPtr이 가리키는 동적으로 할당된 메모리를 해제합니다.

구조체 포인터를 사용하여 구조체의 멤버에 접근하고 값을 할당하는 방법을 통해 동적으로 메모리를 할당하고 사용할 수 있습니다. 이를 통해 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있습니다.

3.4 구조체 포인터를 활용한 동적 메모리 할당

동적 메모리 할당은 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있는 기능입니다. 구조체 포인터를 사용하여 동적으로 메모리를 할당하고 그 메모리에 구조체를 저장할 수 있습니다.

동적 메모리 할당

동적으로 메모리를 할당하기 위해 malloc() 함수를 사용합니다. malloc() 함수는 인자로 전달된 크기만큼의 메모리를 할당하고, 할당된 메모리의 시작 주소를 반환합니다.

studentPtr = malloc(sizeof(Student));

위의 예시에서는 Student 구조체의 크기만큼의 메모리를 할당하고, 그 메모리의 시작 주소를 studentPtr에 저장합니다. 이제 studentPtr은 할당된 메모리를 가리키는 포인터가 되었습니다.

구조체 멤버에 접근 및 값 할당

구조체 포인터를 사용하여 동적으로 할당된 메모리에 접근하고 값을 할당할 수 있습니다. 구조체 포인터는 화살표(->) 연산자를 사용하여 멤버에 접근합니다.

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

위의 예시에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다. 구조체 포인터를 사용하여 다른 멤버에도 접근하고 값을 할당할 수 있습니다.

studentPtr->studentId = 20210001;

위의 예시에서는 studentPtr이 가리키는 구조체의 studentId 멤버에 20210001을 할당합니다.

동적 메모리 해제

동적으로 할당된 메모리는 더 이상 사용하지 않을 때 해제해주어야 합니다. 동적으로 할당된 메모리를 해제하기 위해 free() 함수를 사용합니다.

free(studentPtr);

위의 예시에서는 free() 함수를 사용하여 studentPtr이 가리키는 동적으로 할당된 메모리를 해제합니다. 이제 할당된 메모리를 더 이상 사용하지 않고 자원을 반환했습니다.

구조체 포인터를 사용하여 동적으로 메모리를 할당하고 사용하는 방법은 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있게 해줍니다. 주의해야 할 점은 동적으로 할당한 메모리를 사용한 후에는 반드시 메모리를 해제해주어야 한다는 점입니다. 이를 통해 메모리 누수를 방지하고 자원을 효율적으로 관리할 수 있습니다.
※ 기타 참고사항: 예제 코드의 풀이 및 실행 방법 등은 서술하지 않고, 초보자가 따라하기 쉽게 설명하는데 초점을 맞추어 작성하기 위해 해당 내용이 빠져 있습니다.

3.4 구조체 포인터를 활용한 동적 메모리 할당

동적 메모리 할당은 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있는 방법입니다. 구조체 포인터를 사용하여 동적으로 메모리를 할당하고 그 메모리에 구조체를 저장하는 방법을 알아보겠습니다.

동적 메모리 할당

동적 메모리 할당을 위해서는 malloc() 함수를 사용합니다. malloc() 함수는 인자로 전달한 크기만큼의 메모리를 할당하고, 할당된 메모리의 시작 주소를 반환합니다.

studentPtr = malloc(sizeof(Student));

위의 예제에서는 Student 구조체의 크기만큼의 메모리를 할당하고, 그 메모리의 시작 주소를 studentPtr에 저장합니다. 이제 studentPtr은 할당된 메모리를 가리키는 포인터가 되었습니다.

구조체 멤버에 접근 및 값 할당

구조체 포인터를 사용하여 동적으로 할당된 메모리에 접근하고 값을 할당할 수 있습니다. 구조체 포인터는 화살표(->) 연산자를 사용하여 멤버에 접근할 수 있습니다.

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

위의 예제에서는 strcpy() 함수를 사용하여 studentPtr이 가리키는 구조체의 name 멤버에 "John"이라는 문자열을 할당합니다. 구조체 포인터를 사용하여 다른 멤버에도 접근하고 값을 할당할 수 있습니다.

studentPtr->studentId = 20210001;

위의 예제에서는 studentPtr이 가리키는 구조체의 studentId 멤버에 20210001을 할당합니다.

동적 메모리 해제

동적으로 할당된 메모리는 더 이상 사용하지 않을 때 해제해주어야 합니다. 메모리를 해제하기 위해 free() 함수를 사용합니다.

free(studentPtr);

위의 예제에서는 free() 함수를 사용하여 studentPtr이 가리키는 동적으로 할당된 메모리를 해제합니다. 이제 할당된 메모리를 더 이상 사용하지 않고 자원을 반환했습니다.

구조체 포인터를 사용하여 동적으로 메모리를 할당하고 사용하는 방법을 통해 프로그램이 실행 중에 필요한 메모리를 유연하게 관리할 수 있습니다. 주의해야 할 점은 동적으로 할당한 메모리를 사용한 후에는 반드시 메모리를 해제해주어야 한다는 점입니다. 이를 통해 메모리 누수를 방지하고 자원을 효율적으로 관리할 수 있습니다.