한국어
C/C++
 

C flexible array member 에 대해서

makersweb 2020.02.20 20:31 조회 수 : 1995

"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 는 항상 구조체의 마지막 멤버로 있어야한다.

번호 제목 글쓴이 날짜 조회 수
공지 C Programming FAQs(한글번역 pdf문서) makersweb 2014.03.18 27011
22 비트 필드의 크기는 해당 유형의 크기를 초과할 수 없다. makersweb 2023.04.25 423
» flexible array member 에 대해서 file makersweb 2020.02.20 1995
20 C++로 플러그인 개발 file makersweb 2019.12.08 1867
19 배열과 포인터, 등가포인터 예제 makersweb 2019.01.16 1169
18 싱글톤 객체생성 패턴에 대해서 file makersweb 2018.07.01 3721
17 함수포인터와 typedef로의 선언 makersweb 2018.02.03 1211
16 switch와 if 중 어느 것이 더 빠른가 file makersweb 2017.01.31 2890
15 구조체 배열을 반환하는 함수를 반환하는 함수를 호출하여 구조체 멤버 배열 요소 접근하기 makersweb 2016.05.22 9855
14 c/c++문자열, 유니코드 관련 함수 makersweb 2015.07.09 5294
13 volatile이 정확히 어떤 의미를 가지는 건가요? pjk 2014.09.30 4672
12 HEX(16진수) to ASCII(아스키) 변환 코드 pjk 2014.08.24 33234
11 strcmp, wcscmp, _tcscmp pjk 2014.07.18 10627
10 클래스 멤버에 대한 액세스 제어 pjk 2014.06.27 4766
9 unsigned형의 모든 상수에는 접미사 ‘U’를 사용하여야 한다. file pjk 2014.05.24 37549
8 void형 포인터 pjk 2014.05.24 5188
7 함수 포인터의 배열 pjk 2014.05.24 7667
6 구조체 메모리 저장방식 #pragma pack file pjk 2014.05.24 5443
5 Bit fields(비트필드) pjk 2014.05.24 4490
4 예제소스를 통해 리틀엔디안(Little endian)과 빅엔디안(Big endian)의 차이점 알아보기 pjk 2014.05.24 8244
3 영어를 C언어로, 또는 C언어를 영어로 변환 해주는 cdecl makersweb 2014.03.19 7504