인프런 커뮤니티 질문&답변

김인도님의 프로필 이미지
김인도

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

(기출) 2023년 3회 코드해석 문제

구조체 접근?

해결된 질문

작성

·

157

0

  • 1000022745.jpg이해가 어려운 섹션이나 영상 설명은 질문으로 꼭 남겨주세요.
구조체 멤버를 지정할때구조체명.멤버 구조체명->멤버(*구조체명).멤버로 할수있는것으로 알고있는데그렇다면답은 -> 말고도 .이 될수도 있나요?더불어 위의 코드 하나씩 풀이해주시면 감사하겠습니다. 코도 의미가 너무 어렵고 이해가 안가네요.ㅜㅡㄴ

답변 2

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요, 질문을 주실 때 영상의 몇 분 몇 초대에 문제가 있는지 같이 말씀 부탁드립니다.

 

구조체에서 .(점)으로 접근하는 것은 구조체의 변수 그 자체에서 본인의 멤버에 접근할 때 입니다.

지금 Data라는 구조체 형태로 생성된 d1은 그냥 본인이 구조체 그 자체입니다. 내가 c라는 문자과 numPtr이라는 포인터 변수를 품고 있죠. 2개의 변수를 품고 있는 캥거루라고 잠시 비유하겠습니다.

그런데 d2 변수는 얘기가 달라집니다. 본인 자체가 캥거루가 아닙니다. 그냥 캥거루를 가리키는 포인터입니다. 다만, 내가 가리킬 수 있는 크기가 캥거루만큼 커야합니다. 그냥 본인은 손가락일 뿐입니다. (선언될 때 Data* d2로 되어있기 때문)

우리가 char 형태를 가리키려면 어떻게 포인터 변수를 만들어야 하나요? char* ptr 이렇게 작성해야합니다.

그러면 Data 형태를 가리킬 때는요? Data* ptr 로 만들면 됩니다.



지금 d2 변수는 캥거루를 가리킬 수 있는 손가락입니다. 아무것도 없어요. 형체도 변수도 없죠. 그냥 자신은 캥거루 형태의 메모리를 가리킬 수 있는 손가락만 덜렁 있습니다.

malloc은 동적할당이라고 해서 우리가 배우지 않은 키워드입니다. Data라는 구조체의 크기만큼 데이터를 (여러개도 가능) 할당하는 공간을 만든다는 것인데, 제가 특별히 설명하지 않았습니다. 어쨌든 Data라는 구조체만큼의 메모리 공간을 할당받았다고 생각하시면 됩니다. 여기서는 몰라도 문제를 풀 수 있습니다.

 

d1은 캥거루 그 자체이고, d2는 캥거루를 가리킬 수 있는 손가락이라고 말씀드렸습니다.

내가 구조체 형태의 변수 그 자체이기 때문에 .(점)으로 내부 변수에 접근합니다.

특정 구조체를 가리키고 있는 포인터의 경우, (캥거루를 가리키고 있을 때) 캥거루 안의 변수에 접근하기 위해서는 ->를 사용한다고 말씀드렸습니다.

그래서 a와 b에는 ->만 들어가야합니다. 왜냐하면 d2는 포인터로 선언되어있기 때문입니다.

 

요약하자면,

"구조체 그 자체의 변수라면으로 접근하고, 구조체를 가리키는 포인터라면 화살표로 접근한다." 정도로 이해하시면 좋겠습니다.

 

이해에 도움이 되셨을까요?

김인도님의 프로필 이미지
김인도
질문자

이해가되었습니다 free(d2)는 무엇일까요?

주말코딩님의 프로필 이미지
주말코딩
지식공유자

네, free는 동적할당된 영역을 시스템으로 반환하는 것입니다. 지금 d2에 할당된 영역을 다 사용했으니 메모리를 해제하라는 이야기입니다.

 

동적할당까지 설명하게 되면, 시험에는 잘 안나오는데 너무 학구적으로 되는 커리큘럼이 될 것 같아서 범위에 넣지 않았습니다.

 

혹시나 궁금한 것이 있으면 이 자료를 참고해보세요.

https://wikidocs.net/166083

0

안녕하세요, 인프런 AI 인턴입니다.

관련하여 질문자님의 질문과 유사한 문맥에서 구조체 접근 방법 및 typedef 사용에 대해 설명하는 질문이 들어온 적 있어, 해당 답변이 도움이 될 수 있을 것 같습니다.

구조체 멤버 접근에 사용되는 점 연산자(.)와 화살표 연산자(->)는 서로 다른 상황에서 사용됩니다.
- 점 연산자(.)는 구조체 인스턴스에서 직접 멤버에 접근할 때 사용됩니다.
- 화살표 연산자(->)는 구조체를 가리키는 포인터를 통해 멤버에 접근할 때 사용됩니다.

주어진 예제 코드와 관련된 설명이 필요하다고 하셨는데, 여기서 typedef로 정의한 구조체 Data와 멤버 char 및 포인터 int에 대해 .-> 연산자가 어떻게 사용되는지에 대한 직접적인 설명은 아래의 대화에서 찾을 수 있습니다:

  • “typedef 강좌”에서는 typedef 키워드와 포인터가 가리키는 값에 접근하는 방법에 대해 이야기하고 있습니다. 포인터를 통해 구조체 멤버에 접근하는 방식에 대한 설명이 포함되어 있으므로, 질문자님께서 언급하신 문제와 관련하여 도움 될 수 있습니다.

질문자님이 언급하신 코드에서의 활용법이 정확히 어떤 목적인지, 특히 구조체 멤버 접근 시 .->의 사용에 혼란을 겪고 계신 부분에 대해 더 구체적인 이해가 필요하신 듯합니다. 위 링크에서 제공하는 답변과 예제 코드를 참조하시면, 구조체와 포인터를 활용하는 방법에 대해 보다 명확한 이해를 얻을 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김인도님의 프로필 이미지
김인도

작성한 질문수

질문하기