본문 바로가기
개념/혼자 공부하는 C언어

chapter 17) 배열과 포인터를 멤버로 갖는 구조체 사용

by kiseno 2024. 10. 1.
728x90
반응형
SMALL
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct profile{
    char name[20];
    int age;
    double height;
    char *intro;
};

int main(void){
    struct profile yuni;

    strcpy(yuni.name, "hayun");
    yuni.age = 17;
    yuni.height = 164.7;

    yuni.intro = (char * )malloc(80);
    printf("introduce : ");
    gets(yuni.intro);

    printf("name ; %s\n", yuni.name);
    printf("age : %d\n", yuni.age);
    printf("height : %.1lf\n", yuni.height);
    printf("intro : %s\n", yuni.intro);

    return 0;
}

### 구조체 정의 및 초기화

- `struct profile`은 `name`(이름), `age`(나이), `height`(키), 그리고 `intro`(자기소개)라는 네 개의 멤버 변수를 가지고 있습니다. `name`, `age`, `height`는 각각 문자 배열, 정수, 실수 타입으로 선언되어 있으며, `intro`는 동적 메모리 할당을 위한 문자 포인터입니다.

- `struct profile yuni;`는 `profile` 구조체 타입의 변수 `yuni`를 선언합니다.

- `strcpy(yuni.name, "hayun");`, `yuni.age = 17;`, `yuni.height = 164.7;`을 통해 `yuni`의 각 필드에 이름, 나이, 키를 초기화합니다.

### 동적 메모리 할당 및 사용자 입력

- `yuni.intro = (char *)malloc(80);`를 통해 `yuni`의 자기소개를 위한 문자열을 저장할 메모리 공간을 동적으로 할당합니다.

- `gets(yuni.intro);`는 사용자로부터 자기소개 문자열을 입력받아 `yuni.intro`가 가리키는 메모리 공간에 저장합니다. **주의**: `gets()` 함수는 보안에 취약하고, 버퍼 오버플로우를 발생시킬 수 있으므로 사용을 피해야 합니다. `fgets()` 함수로 대체하는 것이 안전합니다.

### 출력

- `printf` 함수를 사용하여 `yuni`의 이름, 나이, 키, 자기소개를 출력합니다.

### 메모리 해제

- 코드에서는 메모리 해제 부분이 빠져있습니다. 프로그램 종료 전에 `free(yuni.intro);`를 호출하여 동적으로 할당된 메모리를 해제해야 합니다. 동적으로 할당된 메모리는 사용이 끝난 후 반드시 해제해야 합니다.

### 개선된 코드 예시

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

struct profile{
    char name[20];
    int age;
    double height;
    char *intro;
};

int main(void){
    struct profile yuni;

    strcpy(yuni.name, "hayun");
    yuni.age = 17;
    yuni.height = 164.7;

    yuni.intro = (char *)malloc(80);
    if(yuni.intro == NULL){
        printf("Memory allocation failed.\n");
        exit(1);
    }
    printf("introduce : ");
    fgets(yuni.intro, 80, stdin); // gets() 대신 안전한 fgets() 사용

    printf("name ; %s\n", yuni.name);
    printf("age : %d\n", yuni.age);
    printf("height : %.1lf\n", yuni.height);
    printf("intro : %s\n", yuni.intro);

    free(yuni.intro); // 동적으로 할당된 메모리 해제

    return 0;
}


이 버전에서는 `gets()` 대신 `fgets()`를 사용하여 보안 문제를 해결했으며, `free(yuni.intro);`를 추가하여 메모리 누수를 방지했습니다.

728x90
반응형
LIST