2010-11-20 4 views
10

후행 배열 관용구?후행 배열 관용구

P.S :이 용어를 검색하는 것은 입니다. 벡터는 후행 배열 관용구를 사용하여 구현되므로 벡터 객체 자체의 주소를 변경하지 않고 크기를 조정할 수 없습니다.

+0

다른 사람들이 아래 답변에 댓글을 달았 기 때문에 _flexible 배열 member_을 (를) 찾는 것이 더 나을 것입니다. – ninjalj

+0

엄격한 정의에 따르면, 이것은 _UB_ : http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi

답변

10

당신은에서 언급 한 뒤에 배열 관용구를 의미하는 경우 GCC source code이 (견적은 어디에서 오는)은 동적 배열 구현하기 위해 기존의 C 트릭을 참조 할 것 같습니다 : 배열 될 경우

typedef struct { 
    /* header */ 
    size_t nelems; 

    /* actual array */ 
    int a[1]; 
} IntVector; 

IntVector *make_intvector(size_t n) 
{ 
    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1)); 
    if (v != NULL) 
     v->nelems = n; 
    return v; 
} 
+3

그 말은 더 일반적인 용어는 [struct hack] (http://stackoverflow.com/q/3711233/168225)입니다. –

+0

@Georg : 나는 모르겠다. (확실하지는 않지만) 다른 말로는 (당신이 말했듯이)'struct hack'이'Trailing array idiom' 대신에 사용되었을 것입니다. –

+0

@Prasoon : 저자는 방금 다른 용어를 사용했을 것입니다. 처음으로 누군가가 그랬을 것입니다. "구조 해킹"은 어쨌든 조금 비공식적으로 들립니다. –

1

가변 배열 크기를 가질 수있는 구조체의 배열을 가리키는 것으로 보입니다. 참조 : 당신이 표현 구글 경우

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspxhttp://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

또 다른 팁은, 배열을 후행 "와 같은" "의 표현을 넣어"이것은 당신에게 더 구체적인 결과를 제공 할 것입니다. Google은 후행 배열에 대해 알고 있습니다.

+0

+1 MSDN 기사에 대한 링크, 흥미로운 내용 . –

1

로 만든 내가 무슨 생각을 의미하는 것은 :

struct foo { 
    ... some data members, maybe the length of bar ... 
    char bar[]; /* last member of foo, char is just an example */ 
}; 

malloc(sizeof(struct foo)+LEN)으로 할당하여 사용하며, 여기서 LEN은 원하는 길이 인 bar입니다. 이 경우에만 malloc이 필요합니다. []은 마지막 struct 멤버에서만 사용할 수 있습니다.

GCC 문서를 이해할 때, struct foo은 저장 구조가 고정되지 않았거나 포인터가 아니기 때문에 (합리적으로) 다른 구조체의 마지막 구성원으로 만 사용할 수 있습니다.

+0

이것은 "유연한 배열 구성원"이라고하며 C99 표준 (§6.7.2.1P16)에 있습니다. – aib