프로그래밍언어/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