답변
그것은 당신이 C99이없는 경우에 유용 GCC extension 인 제로 크기의 배열은,입니다.
간단히 길이가 0 인 배열입니다. http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html에 따르면
정말 가변 길이 개체의 헤더 인 배열 그들은 구조의 마지막 요소로서 매우 유용 GNU C에서 허용되는 길이가 0 :
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
GNU 사이트에서이 파일을 복사 했으므로 잘못이 아니지만 'this_length'는 어디에도 정의되어 있지 않습니다. –
@Hunter McMillen : 글 머리 기호 일뿐입니다. 코드를 컴파일하는 것보다 훨씬 많은 것을 추가해야합니다. 'lengh' 멤버에게 할당하고 싶은 가치라고 생각합니다. – Tudor
캡슐화 용입니다.
세부 정보를 모른 채 인터페이스를 만드는 데 사용됩니다. 다음은 간단한 예입니다.
test.h (인터페이스)에는 두 개의 필드가있는 test_t 구조체가 있음을 보여줍니다. 그리고 세 가지 기능을 가지고 있는데, 첫번째는 구조를 만드는 것입니다. set_x는 구조체에 정수를 저장합니다. get_x는 저장된 정수를 가져 오는 것입니다.
언제 x를 저장할 수 있습니까?
구현 책임자 (test.c)는 x가 들어있는 다른 구조체를 선언합니다. "test_create"에서이 구조를 malloc하기 위해 몇 가지 트릭을 연주하십시오.
일단 인터페이스와 구현이 완료되었습니다. 응용 프로그램 (main.c)은 x 위치를 모른 채 x를 설정/가져올 수 있습니다.
test.h
struct test_t
{
int field1;
int field2[0];
};
struct test_t *test_create();
void set_x(struct test_t *thiz, int x);
int get_x(struct test_t *thiz);
TEST.C
#include "test.h"
struct test_priv_t {
int x;
};
struct test_t *test_create()
{
return (struct test_t*)malloc(sizeof(struct test_t) + sizeof(struct test_priv_t);
}
void set_x(struct test_t *thiz, int x)
{
struct test_priv_t *priv = (struct test_priv_t *)thiz->field2;
}
int get_x(struct test_t *thiz)
{
struct test_priv_t *priv = (struct test_priv_t *)thiz->field2;
}
main.c를
#include "test.h"
int main()
{
struct test_t *test = test_create();
set_x(test, 1);
printf("%d\n", get_x(test));
}
참고 : C99을 사용할 수 있는지,'구조체 테스트를 사용 {INT 필드 1; int field2 []; }; 대신. 이것은 모든 C99 (및 이후) 컴파일러에서 이식 가능합니다. –
그리고 검색 가능한 용어를 추가하기 위해 그러한 짐승을 "유연한 배열 구성원"이라고 부릅니다. –