• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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) 단위로 움직일텐데 
그럼 이상한 상황이 연출되지 않으련지,,, 궁금하여 여쭙습니다!

답변 1

답변을 작성해보세요.

0

안소님의 프로필

안소

2021.03.13

그런 상황이 발생할 수도 있을 것 같아요. C는 개발자가 메모리를 자유자재로 다룰 수 있는 언어이니만큼 질문자님께서 우려하시는 그런 상황이 충분히 발생할 수 있을 것 같기도 합니다. 그런 상황이 연출되지 않게끔 개발자가 고려하고 조심해서 사용해야할 부분인 것 같아요.