본문 바로가기
[개발자 로드맵]/C

[C언어 코딩 도장 심사문제 답] 49.8_사람과 자동차 구조체 포인터에 메모리 할당하기

by Ramrider 2022. 6. 30.
728x90
반응형

1. 답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>											
#include <stdlib.h>
#include <limits.h>
#include <float.h>
#define PI 3.141592f
#include <inttypes.h>
#include <string.h>										

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

typedef struct {
    char name[20];
    int number;
    int displacement;
} Car;

int main()
{
    //답 구간 시작
    struct Person* p1 = malloc(sizeof(struct Person));
    strcpy(p1->name, "고길동");
    p1->age = 40;
    strcpy(p1->address, "서울시 서초구 반포동");

    Car* c1 = malloc(sizeof(Car));
    strcpy(c1->name, "스텔라");
    c1->number = 3421;
    c1->displacement = 2000;
    //답 구간 끝

    printf("이름: %s\n", p1->name);
    printf("나이: %d\n", p1->age);
    printf("주소: %s\n", p1->address);

    printf("자동차 이름: %s\n", c1->name);
    printf("자동차 번호: %d\n", c1->number);
    printf("배기량: %dcc\n", c1->displacement);

    free(p1);
    free(c1);

    return 0;
}

2. 결과

실행 결과

3. 정리

struct Person person;
    struct Person* p1;
    p1 = &person;

    strcpy(p1->name, "고길동");
    p1->age = 40;
    strcpy(p1->address, "서울시 서초구 반포동");

 

처음에 작성한 struct 구조체입니다만, 문제에서는 틀린 답이 됩니다. 왜냐하면 밑에 free(p1)가 있으므로 malloc()으로 포인터 메모리 할당이 필요합니다. 위 방식으로 진행하면 메모리 할당을 하지 않았는데 왜 메모리를 해제해? 라면서 오류가 발생할 것으로 생각됩니다.(free(p1)로 메모리 해제가 없었다면 이렇게 진행하여도 문제가 없을 것입니다.)

이 문제의 특징은 일반 구조체와 익명 구조체의 포인터를 활용할 때 동적 메모리를 할당할 수 있느냐? 가 문제의 질문이라고 생각합니다. 일반 구조체의 경우 struct Person* p1 = malloc(sizeof(struct Person));과 같이 struct이 같이 들어가 주는 것이 포인트입니다. 반면 익명 구조체(사용자 지정 구조체, typedef 구조체, 별칭)는 Car* c1 = malloc(sizeof(Car)); 처럼 struct을 제거하여 작성해줍니다. 쉽게 생각하면 typedef를 사용하는 것은 struct이라는 단어의 반복 사용이 번거로워 이를 제거하기 위함도 있으므로 구조체 포인터를 선언할 때에도 struct을 제거한다라고 생각해도 괜찮을 것 같습니다.

4. 비고

  • 코딩 도장 심사문제는 아래 링크 바로가기를 눌러주세요. 간단한 가입 진행 후 이용 가능하므로 참고 부탁드립니다.
  • 코딩 도장 문제 링크 바로가기 : https://dojang.io/mod/quiz/attempt.php?attempt=1823151&cmid=425

 

728x90
반응형

댓글