해결된 질문
작성
·
112
·
수정됨
1
안녕하세요. typedef 강의를 수강하다 처음 보는 내용들이 너무 많은 와중, typedef 기출 문제(약 3분 15초 즘)에 대해 질문을 남깁니다.
구조체 형태의 Data라는 타입명을 가진 변수 Data를 커스텀으로 정의 후, 해당 타입을 활용하기 위해 main 함수 내부에서 Data 타입(구조체) 변수 d1과 Data 포인터 타입(구조체 포인터) 변수 d2를 선언했습니다.
이 문제에서 핵심은
구조체 타입의 포인터 변수를 선언할 경우, 해당 변수의 멤버 변수에 .(dot)을 통해 직접 접근 할 수 없다.
우리는 멤버 변수에 할당된 메모리 주소에 접근할 수 있기 때문에, ->(arrow)를 통해 접근하여 해당 주소에 저장된 값을 불러오는 방법을 활용해야 한다.
라고 생각했습니다. 즉, d1의 numPtr에 값을 저장 및 접근 할 때와 d2에서 할 때의 차이를 배우기 위한 문제라고 생각이 들었습니다.
그런데, 갑자기 stdlib.h의 내장 함수인 malloc에 대한 코드가 나왔습니다.
malloc은 동적으로 메모리 주소를 할당하기 위한 함수라는 것을 알게 되었습니다.,malloc(sizeof(type명))을 통해 포인터 변수에 메모리 영역을 할당하고, 이후 main 함수를 빠져나가기 전 free를 통해 할당했던 메모리 영역을 해제시켜 줬는데요.
왜 해당 방식으로 문제가 출제되었는지 이해가 되지 않아서 질문을 남깁니다.
독립적인 Data 타입의 구조체 인스턴스(?)를 만들고 싶은데, 이를 d1 처럼 생성하고 싶지 않을 경우에는 반드시 저 방법을 활용해야 하는 것인가요???
malloc을 통해 선언 하는 방식과 아래의 방식에 차이가 있나요?
Data d2; // 구조체 변수 선언
Data *d2Ptr = &d2; // 구조체 변수의 메모리 주소에 접근하기 위한 포인터 변수 선언
부족한 지식으로 인해 아직은 어렵지만, 차근차근 배워나가는 재미가 있습니다. 항상 좋은 강의 감사드립니다!
답변 2
0
안녕하세요.
열심히 하시는 모습을 보니 꼭 합격하셨으면 하는 마음입니다.
일단 1번 질문이 조금 이해가 안 갑니다.
typedef를 사용하지 않고 바로 구조체를 사용하는 방법은 있습니다만, typedef를 사용하고 싶으신 건가요?
typedef는 구조체랑은 크게 상관없이 그저 제가 정한 타입을 다른 이름으로 사용하는 방법입니다.
정확히 어떤 질문인지를 모르겠어서, 조금 더 구체화해서 말씀해주시면 좋겠습니다.
이미 Data라는 타입을 하나 정해서 독립적으로 선언한 것이 D1입니다.
2번 질문의 답변으로는 "큰 차이가 없습니다."
C언어의 동적할당으로 malloc, calloc, realloc.. 뭐 이런 것들을 컴퓨터공학과 학생들이 배우긴 합니다.
"동적할당"이라는 단어 자체가 한자어라서 조금 이해가 어려울 수는 있는데
쉽게 말하면 "그냥 메모리 공간을 원하는 크기만큼 할당해놓는 것"입니다.
지금은 Data라는 구조체 크기만큼 어딘가가 원룸을 만들어놓은 것 뿐입니다.
(→ 주의: 프로그램이 동작하면서 만들어줌. 미리 만들어둔 것이 아님.)
그래서 거의 같다고 생각하시면 됩니다.
"거의 같다"라고 말씀드린 이유는 우리가 변수를 선언해서 프로그램이 실행될 때
프로그램이 선언되자마자 메모리에 올라가는 스택 영역이라는 것이 있고
프로그램이 동작하면서 할당되는 힙 영역이라는 것이 있는데 할당되는 영역이 달라서 엄밀하게 말하면 차이가 있긴 합니다.
하지만 그것은 학부 수준의 프로그래밍 언어론처럼 C언어를 공부할 때나 이야기이고,
정보처리기사 실기 시험에서는 그렇게까지 깊게 나오지 않습니다.
실기시험에서는 컴파일시나, 런타임시에 오류가 나는 경우를 같은 것을 물어본 경우도 없거니와
애초에 이런 걸 물어볼 정도로 개별 언어를 깊게 다루지 않습니다.
여튼, 기능 상에서는 거의 똑같은 코드라고 봐주시면 됩니다.
추가 질문은 대댓글로 부탁드립니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김민규님.
질문 주신 내용은 구조체와 포인터, 그리고 동적 메모리 할당에 관한 중요한 부분입니다. 각 점을 중심으로 설명드리겠습니다.
구조체 포인터 접근:
.
(dot) 연산자를 사용하지만, 구조체 포인터를 사용할 때는 ->
(arrow) 연산자를 사용해야 합니다. 이는 구조체 포인터가 구조체의 주소를 가리키기 때문입니다.동적 메모리 할당(malloc):
malloc
은 사용 중인 메모리 크기에 맞게 메모리를 동적으로 할당하는 함수입니다. 특히 큰 구조체나 필요한 수만큼의 구조체 인스턴스를 만들 때 유용합니다.free
로 메모리를 해제해야 메모리 누수를 방지할 수 있습니다.구조체 인스턴스 생성 방법:
Data d1;
와 같이 스택에 생성할 수 있습니다. 하지만 크기가 큰 자료구조이거나, 동적인 생성이 필요할 경우 힙 영역에 메모리를 할당해야 하는데, 이때 malloc
를 사용합니다. 이 방법을 통해 독립된 구조체 인스턴스를 만들 수 있습니다.malloc과 일반 선언 방식의 차이:
Data d2;
는 스택에 구조체 변수를 선언하는 것이고, malloc
을 사용한 방법은 힙에 동적으로 구조체 변수를 선언하는 것입니다.free
를 호출해 수동으로 해제해 줘야 합니다.위의 링크를 통해 구조체와 포인터, malloc에 대한 더 깊이 있는 설명을 참고하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
자세한 답변 감사드립니다!
1번 문제는 제가 강의를 구조체 -> typedef 순으로 듣지 않고, 구조체 강의를 저도 모르게 건너 뛰어서 발생한 이상한 질문이었습니다... 죄송합니다
typedef 강의에서 구조체를 함께 설명하는 줄 알았네요!!
결국 기존에는 스택 영역에 메모리 주소 공간이 할당되고, 동적 할당 방식을 사용할 경우 해당 코드가 동작하는 순간 힙 영역에 필요한 크기 만큼의(sizeof을 활용하여 지정) 동적인 메모리 주소 공간이 할당되는 것이라고 이해하면 될까요??
항상 친절한 답변 감사드립니다!