inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

14.11 신축성있는 배열 멤버

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

해결된 질문

88

oonsy99

작성한 질문수 3

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는 원본과 같은 메모리 참조

     

c

답변 1

1

Soobak

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

 

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

 

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

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

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

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

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

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

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

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

Export template 안됨

1

19

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

54

3

main 함수에서 왜 int만 선언이 되는걸까요

1

56

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

138

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

80

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

114

2

소스파일안에 여러 파일

1

76

2

F5와 F7의 차이

1

77

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

70

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

75

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

61

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2