Ваши коллеги солгали.(Вероятно, не намеренно, хотя, поэтому не злитесь на них или что-то в этом роде.)
Это называется членом гибкого массива, а в 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
s и два free
s).