C 구조의 가변 길이 배열에 대한 질문이 있습니다 (http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html).공용 구조체 유형 및 가변 배열 구성원
typedef struct {
size_t N;
int elems[];
} A_t;
이제 일반적인 접근 방식은
A_t * a = malloc(sizeof(A_t) + sizeof(int) * N)
a->N = N;
....
지금이 다른 구조체에 물건을 통합 또는 스택 기반 할당을 할 때 어색한 것 같다, 아주 분명하다. 그래서 다음 snipet 같은 일이
N!=0
struct {
A_t a;
A_t b; /// !!!!!
double c; /// !!!!!
};
가 지금은 또 다른 유형을 정의하여 다음
typedef struct {
size_t N;
int elems[5];
} A_5_t;
struct {
A_5_t a;
A_5_t b;
double c; // should work here now.
} mystruct;
하고있는 것처럼 사용과 같은 용도로 허용 할 수 있어야한다고 생각 실패 할 수밖에 없다 그것을 A_t
구조입니다. 함수 void foo(A_t * arg1);
을 호출 할 때는 foo((A_t*) (&mystruct.b))
과 같은 것을 사용해야합니다. 어느 것이 - 나에게 - 조금 서투른 것처럼 보인다. 그러므로 나는 이것을 할 수있는 더 좋은 방법이 있는지 궁금해합니다. 어떻게 든이 유니온 타입을 사용할 수 있을지 궁금합니다.
가변 길이 배열을 사용하면 구조에서 데이터를 한 조각으로 가질 수 있기 때문에 깊고 얕은 복사본이 걱정되는 대신 단일 명령으로 구조체를 복사 할 수 있으므로,
귀하의 링크 http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html은 C90에 대한 GCC 확장입니다. 귀하의 예제 인'int elems [];'는 "flexible array member"라는 C99 (및 C11) 기능을 사용합니다. '[0]'과'[] '의 차이점을 보았습니까? 'elems'는'int elems [];에서 길이가 0 인 배열이 아닌 ** **입니다. 길이가 0 인 배열은 모든 C 표준에 의해 금지됩니다 (확장을위한 좋은 장소가되지만 불완전한 배열이되지는 않습니다). –
제로 길이와 플렉시벨 길이 어레이의 차이점을 확인합니다. 링크 된 GNU 페이지가 실제로 문서화됩니다. 내 질문은 struct 및 flexibel 배열 길이를 효과적으로 할당하는 패턴을 사용하는 방법에 관한 것이 었습니다. – wirrbel