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;
이 경우, malloc
시 chars
의 길이는 명시되지 않았으므로 무시된다.
즉 int
의 크기 + n
바이트에 해당하는 공간이 할당된다. 이 n
바이트는 비로소 chars
를 위한 공간으로 사용된다.
-
주의사항
-
flexible array member는 반드시 구조체 정의 마지막에 나타나야 한다.
-
구조체는 다른 멤버를 최소 하나 이상 갖고 있어야 한다.
-
구조체를 복사할 때 flexible array member는 복사되지 않는다.
-
flexible array member를 가진 구조체 타입은 incomplete type에 해당한다.