/ C, PROGRAMMING, DATASTRUCTURE

C언어: Flexible Array Members (C99)

struct hack 이라고도 불리며, C에서 문자열의 길이를 동적으로 조절하기 위한 일종의 편법이다.

다음과 같은 형태의 구조체를 선언하고 구조체 크기 + n-1 만큼의 동적 메모리를 할당하여 사용하는 idiom이었는데, C99에서 표준화되었다.

struct vstring {
	int len;
	char chars[1];
}

struct vstring* str = malloc(sizeof(struct vstring) + n - 1);
str->len = n;

이렇게 하면 chars 를 길이가 n (=len)인 캐릭터 배열로 활용할 수 있다.

C99에서는 배열 길이를 명시하지 않을 수 있도록 하였다.

이런 형태의 배열 멤버를 flexible array member라고 한다.

struct vstring {
	int len;
	char chars[];
}

struct vstring* str = malloc(sizeof(struct vstring) + n);
str->len = n;

이 경우, mallocchars 의 길이는 명시되지 않았으므로 무시된다.

int 의 크기 + n 바이트에 해당하는 공간이 할당된다. 이 n바이트는 비로소 chars 를 위한 공간으로 사용된다.

  • 주의사항

    • flexible array member는 반드시 구조체 정의 마지막에 나타나야 한다.

    • 구조체는 다른 멤버를 최소 하나 이상 갖고 있어야 한다.

    • 구조체를 복사할 때 flexible array member는 복사되지 않는다.

flexible array member를 가진 구조체 타입은 incomplete type에 해당한다.