"flexible array member"라는 개념은 C99에서 표준으로 도입됐다. flexible array member 는 프로그램에서 배열의 크기를 미리 명시하지 않고 나중에 동적으로 할당할 수 있도록 허용한다.
이 개념을 이용하면 프로그램의 실행시간(run-time)에 문자열의 길이에 따라 동적으로 할당 할 때 유용하다. 다음의 간단한 예제 소스코드를 보자.
#include <string.h>
typedef struct {
int length;
char str[]; /* flexible array member */
} String;
String *add_String(const char * const str1, const char * const str2)
{
int length1 = strlen(str1);
int length2 = strlen(str2);
String *ret = malloc(sizeof (String) + length1 + length2 + 1);
if(ret != NULL){
ret->length = length1 + length2;
strcat(ret->str, str1);
strcat(ret->str, str2);
}
return ret;
}
add_String 함수는 string 구조체가 그 멤버인 str이 주어진 문자열을 충분히 포함할 수 있도록 공간을 할당하고 문자열을 붙여준다.
void delete_String(String *str)
{
free(str);
}
int main()
{
char *hello = "Hello ";
char *makersweb = "Makersweb!";
String *title = add_String(hello, makersweb);
printf("string: %s\n", title->str);
printf("length: %d\n", title->length);
delete_String(title);
printf("result: %s\n" , title->str );
return 0;
}
결과:
flexible array member 를 사용할 때 두가지를 조심해야 한다. 첫번째는 구조체에 다른 멤버가 하나 이상 포함되어야한다. 즉, 다음과 같은 코드는 잘못된 것이다.
typedef struct {
char str[]; /* flexible array member */
} String;
두번째로 flexible array member 는 항상 구조체의 마지막 멤버로 있어야한다.