후행 배열 관용구?후행 배열 관용구
P.S :이 용어를 검색하는 것은 입니다. 벡터는 후행 배열 관용구를 사용하여 구현되므로 벡터 객체 자체의 주소를 변경하지 않고 크기를 조정할 수 없습니다.
후행 배열 관용구?후행 배열 관용구
P.S :이 용어를 검색하는 것은 입니다. 벡터는 후행 배열 관용구를 사용하여 구현되므로 벡터 객체 자체의 주소를 변경하지 않고 크기를 조정할 수 없습니다.
당신은에서 언급 한 뒤에 배열 관용구를 의미하는 경우 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;
}
그 말은 더 일반적인 용어는 [struct hack] (http://stackoverflow.com/q/3711233/168225)입니다. –
@Georg : 나는 모르겠다. (확실하지는 않지만) 다른 말로는 (당신이 말했듯이)'struct hack'이'Trailing array idiom' 대신에 사용되었을 것입니다. –
@Prasoon : 저자는 방금 다른 용어를 사용했을 것입니다. 처음으로 누군가가 그랬을 것입니다. "구조 해킹"은 어쨌든 조금 비공식적으로 들립니다. –
가변 배열 크기를 가질 수있는 구조체의 배열을 가리키는 것으로 보입니다. 참조 : 당신이 표현 구글 경우
http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx 및 http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html
또 다른 팁은, 배열을 후행 "와 같은" "의 표현을 넣어"이것은 당신에게 더 구체적인 결과를 제공 할 것입니다. Google은 후행 배열에 대해 알고 있습니다.
+1 MSDN 기사에 대한 링크, 흥미로운 내용 . –
로 만든 내가 무슨 생각을 의미하는 것은 :
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
은 저장 구조가 고정되지 않았거나 포인터가 아니기 때문에 (합리적으로) 다른 구조체의 마지막 구성원으로 만 사용할 수 있습니다.
이것은 "유연한 배열 구성원"이라고하며 C99 표준 (§6.7.2.1P16)에 있습니다. – aib
다른 사람들이 아래 답변에 댓글을 달았 기 때문에 _flexible 배열 member_을 (를) 찾는 것이 더 나을 것입니다. – ninjalj
엄격한 정의에 따르면, 이것은 _UB_ : http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined-behavior – sbi