-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
미해결
flexible array member 질문 드립니다.
21.03.11 18:38 작성 조회수 143
0
struct flex {
size_t count; // 4 bytes
double average; // 8 bytes
double values[]; // Flexible array member
};
const size_t n = 3;
int main() {
struct flex* pf = (struct flex*)malloc(sizeof(struct flex) + n * sizeof(double));
if (pf == NULL) exit(1);
struct flex* pf2 = pf +1;
printf("%lld\n", (long long)(pf));
printf("%lld\n", (long long)(pf2));
pf->count = n;
pf->values[0] = 1.1;
pf->values[1] = 2.1;
pf->values[2] = 3.1;
printf("%lld\n", (long long)(pf));
printf("%lld\n", (long long)(pf2));
printf("\n");
printf("%lld\n", (long long)(&pf->values[1]));
printf("%lld\n", (long long)(&pf2->average));
}
flexible array member를 가진 pf의 경우,
sizeof 연산자는 pf->value를 0의 크기로 나타내는데,
그 array에 값들이 들어갈 경우, 실제 메모리를 더 차지하게 되는데요!
이런 상황에서 포인터 연산으로 pf2를 만들어 줬을때 ,
제가 첨부한 코드처럼
위의 flexible array 멤버가 pf2 의 영역을 침범하는 경우가 발생하지 않나요?
저는 임의로 상황을 만들어서 억지스럽긴 하지만
struct flex 를 원소로 갖는 배열이 있다고 하면,
배열의 인덱싱은 sizeof(struct flex) 단위로 움직일텐데
그럼 이상한 상황이 연출되지 않으련지,,, 궁금하여 여쭙습니다!
답변을 작성해보세요.
0
안소
2021.03.13
그런 상황이 발생할 수도 있을 것 같아요. C는 개발자가 메모리를 자유자재로 다룰 수 있는 언어이니만큼 질문자님께서 우려하시는 그런 상황이 충분히 발생할 수 있을 것 같기도 합니다. 그런 상황이 연출되지 않게끔 개발자가 고려하고 조심해서 사용해야할 부분인 것 같아요.
답변 1