2012-06-05 2 views
4

다음 선언의 목적은 무엇입니까?선언의 목적은 "int t [0];" 서브?

struct test 
{ 
    int field1; 
    int field2[0]; 
}; 
+2

참고 : C99을 사용할 수 있는지,'구조체 테스트를 사용 {INT 필드 1; int field2 []; }; 대신. 이것은 모든 C99 (및 이후) ​​컴파일러에서 이식 가능합니다. –

+2

그리고 검색 가능한 용어를 추가하기 위해 그러한 짐승을 "유연한 배열 구성원"이라고 부릅니다. –

답변

3

그것은 당신이 C99이없는 경우에 유용 GCC extension 인 제로 크기의 배열은,입니다.

7

간단히 길이가 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; 
+3

GNU 사이트에서이 파일을 복사 했으므로 잘못이 아니지만 'this_length'는 어디에도 정의되어 있지 않습니다. –

+0

@Hunter McMillen : 글 머리 기호 일뿐입니다. 코드를 컴파일하는 것보다 훨씬 많은 것을 추가해야합니다. 'lengh' 멤버에게 할당하고 싶은 가치라고 생각합니다. – Tudor

0

캡슐화 용입니다.

세부 정보를 모른 채 인터페이스를 만드는 데 사용됩니다. 다음은 간단한 예입니다.

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)); 
}