한국어
C/C++
 

C flexible array member 에 대해서

makersweb 2020.02.20 20:31 조회 수 : 2867

"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.png

 

flexible array member 를 사용할 때 두가지를 조심해야 한다. 첫번째는 구조체에 다른 멤버가 하나 이상 포함되어야한다. 즉, 다음과 같은 코드는 잘못된 것이다.

typedef struct {
    char str[]; /* flexible array member */
} String;

 

두번째로 flexible array member 는 항상 구조체의 마지막 멤버로 있어야한다.