강의

멘토링

로드맵

Inflearn brand logo image

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

oonsy99님의 프로필 이미지
oonsy99

작성한 질문수

홍정모의 따라하며 배우는 C언어

14.11 신축성있는 배열 멤버

values[ ]와 * values 관련 질문드립니다.

해결된 질문

작성

·

71

1

안녕하세요. 강의를 들으며 필기를 하던 중 확신이 가지 않는 부분이 있어 질문드립니다.

아래에 작성한 코드에서 동적 메모리 할당을 통해 FAM과 구조체를 어떻게 연결하여 활용할 수 있는지 대한 과정을 주석으로 정리했습니다. 이 과정이 정확한지 확인 부탁드리며, 또한 FAM을 구조체의 마지막 멤버로 선언해야 하는 이유가 해당 과정으로 인한 규칙인지 궁금합니다.

또 필기 중 제가 이해한 부분에 틀린 내용이 있다면 피드백 주시면 감사하겠습니다.

 

[ 필기 내용 ]

  1. values[ ]는 메모리 차지 x , * values는 포인터 변수 자체가 메모리 차지

     

  2. values[ ]는 구조체와 같은 메모리 블록에 존재, * values는 구조체와 독립된 메모리 블록에 위치

    struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
    
    // 동적 할당으로 sizeof(struct flex) + n * sizeof(double) 크기의 메모리 할당
    
    // 이 메모리를 struct flex* 타입으로 캐스팅 (해당 메모리의 주소를 struct flex*로 사용할 것을 지정)
    
    // 다른 멤버의 크기 (구조체의 고정 멤버) sizeof(struct flex) 계산 후, 남은 공간을 배열이 차지

     

  3. 다른 구조체 포인터 변수에 값 대입 시 values[ ]의 메모리(값)는 복사 x, * values는 원본과 같은 메모리 참조

     

답변 1

1

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

필기하신 내용 꼼꼼히 살펴보았습니다.
필기 1 ~ 3 모두 올바르게 잘 이해하고 계신 내용입니다. 틀린 내용은 없습니다.

 

구조체의 마지막 멤버로 선언해야 하는 이유는 필기해주신 내용과도 연관이 있습니다.

이해에 도움을 드리기 위해서 그 이유에 대한 전체적인 설명을 드려보면 다음과 같습니다.

구조체 멤버들은 메모리에서 연속적으로 그리고 특정 크기로 배치됩니다.

이 때, FAM 의 경우 고정 크기가 없으므로, 메모리의 마지막에 위치해야 동적 할당을 통해 가변 크기를 안전하게 확장할 수 있게 됩니다. (예를 들어, 강의 코드 중 value[] 공간은 구조체 뒤에 연속적으로 이어집니다.)

따라서, FAM 이 구조체의 중간이나 앞부분에 선언되면, 다른 구조체 멤버의 위치를 정확히 계산할 수 없게 되고 정의되지 않은 동작이 발생할 수 있습니다.

즉, 전체적인 과정에서 '구조체의 멤버들이 메모리 상에서 관리되는 부분' 과 '동적 메모리 할당이 이루어질 때 메모리가 연속적으로 할당되는 부분' 을 종합해보시면 FAM 이 구조체의 마지막에 위치해야 하는 이유의 이해에 도움이 되실 것 같습니다.

또한, 강의 초반 부분 중 FAM 이 C표준으로 들어오게 되었다는 내용과 관련하여, FAM 에 대한 C표준 규칙에서 FAM은 반드시 구조체의 마지막에 선언되어야 한다고 명시되어있다는 점도 소개드려봅니다.

종합해보면, 고정 크기 멤버 이후에 크기가 변할 수 있는 FAM 이 배치되어야 연속적인 메모리 구조를 보장할 수 있다는 점, 그리고 마지막에 배치하여야 메모리가 구조체 뒤에 연속적으로 확장되므로, 동적 메모리 관리가 효율적이라는 점을 이유로 말씀드릴 수 있겠습니다.

oonsy99님의 프로필 이미지
oonsy99

작성한 질문수

질문하기