동료가 거짓말했습니다. (아마도 의도적으로 의도적으로 그렇게하지는 않을 것입니다.)
유연한 배열 구성원이라고하며 C99는 char bar[];
이고 C89는 char bar[1];
이며 일부 컴파일러는 char bar[0];
으로 작성하십시오. 기본적으로, 당신은 단지 구조에 대한 포인터를 사용하고, 마지막에 여분의 공간의 양을 모두 할당 :
const size_t i = sizeof("Hello, world!");
struct foo *p = malloc(offsetof(struct foo, bar) + i);
memcpy(p->bar, "Hello, world!", i);
// initialize other members of p
printf("%s\n", p->bar);
그런 식으로, p->bar
저장 크기가 배열 선언에 의해 제한되지 않는 문자열을하지만, 이것은 여전히 struct
의 나머지 부분과 동일한 할당으로 이루어지며 (구성원이 char *
이어야하고 두 개의 숫자가 malloc
이고 두 개의 숫자가 free
이어야합니다).
아, 이제 알겠습니다. 이 방법으로 구조 인스턴스는 연속적인 메모리 영역에 포함됩니다. 막대가 포인터이면 다른 메모리 덩어리를 가리 킵니다. 따라서 유연한 배열은 예를 들어 단일 memcopy로 구조를 복사 할 수 있습니다. 리눅스 커널에서 그 구조를 찾았고 사실 하나의 memcopy가 커널 공간에서 사용자 공간으로 복사하는 데 사용되었습니다. – Emiliano
@happy_emi - 하나의'memcpy' (커다란 플러스) 외에도 하나의'malloc' (상대적으로 비쌀 수 있습니다. . –
물론. (btw는 memcpy가 아닌 copy_to_user를 의미합니다.) – Emiliano