프로그래밍언어/C언어[Error]

[C언어][Error] 053. invalid use of flexible array member – flexible 배열 멤버 잘못 사용

about_IT 2025. 4. 28. 00:12
728x90

이 오류는 구조체의 마지막 멤버로 선언되는 flexible array member(유연 배열 멤버)를 문법적으로 허용되지 않는 방식으로 사용할 때 발생합니다. C언어에서는 구조체의 마지막 필드로 int arr[];처럼 크기 없는 배열을 선언할 수 있지만, 몇 가지 제한사항이 존재합니다.


예를 들어, flexible array member는 반드시 구조체의 마지막 멤버여야 하며, 구조체를 직접 초기화할 수 없습니다. 이러한 규칙을 위반하면 컴파일 오류가 발생합니다.



● 오류 예제

#include <stdio.h>

struct Packet {
    int length;
    char data[];
};

int main() {
    struct Packet p = {5, {'H', 'e', 'l', 'l', 'o'}};  // 오류: flexible array는 직접 초기화 불가
    return 0;
}

컴파일러는 다음과 같은 오류 메시지를 출력합니다.

error: invalid use of flexible array member


● 해결 방법

유연 배열 멤버는 구조체를 동적 메모리 할당을 통해 사용해야 하며, 직접 초기화할 수 없습니다. malloc 등을 통해 크기를 동적으로 지정해야 합니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Packet {
    int length;
    char data[];
};

int main() {
    int len = 5;
    struct Packet* p = malloc(sizeof(struct Packet) + len * sizeof(char));
    p->length = len;
    memcpy(p->data, "Hello", len);

    printf("Data: %.*s\n", p->length, p->data);

    free(p);
    return 0;
}

출력 결과:

Data: Hello


● 실전 팁

  • Flexible array member는 구조체의 마지막 멤버로만 선언 가능하며 크기를 명시할 수 없습니다.
  • 초기화는 직접 불가하며 malloc 등을 통해 동적으로 메모리를 할당한 후 사용해야 합니다.
  • 문자열 등 데이터를 복사할 때는 memcpy나 snprintf 등을 이용해야 합니다.

유연 배열 멤버는 효율적인 메모리 활용이 가능하지만, 잘못 사용하면 컴파일 오류를 유발할 수 있습니다. 항상 규칙을 준수하고 동적 메모리 관리와 함께 사용하는 것이 핵심입니다.

728x90