values[ ]와 * values 관련 질문드립니다.
안녕하세요. 강의를 들으며 필기를 하던 중 확신이 가지 않는 부분이 있어 질문드립니다.
아래에 작성한 코드에서 동적 메모리 할당을 통해 FAM과 구조체를 어떻게 연결하여 활용할 수 있는지 대한 과정을 주석으로 정리했습니다. 이 과정이 정확한지 확인 부탁드리며, 또한 FAM을 구조체의 마지막 멤버로 선언해야 하는 이유가 해당 과정으로 인한 규칙인지 궁금합니다.
또 필기 중 제가 이해한 부분에 틀린 내용이 있다면 피드백 주시면 감사하겠습니다.
[ 필기 내용 ]
values[ ]는 메모리 차지 x , * values는 포인터 변수 자체가 메모리 차지
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) 계산 후, 남은 공간을 배열이 차지다른 구조체 포인터 변수에 값 대입 시 values[ ]의 메모리(값)는 복사 x, * values는 원본과 같은 메모리 참조
답변 1
1
안녕하세요? 질문&답변 도우미 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





