Мой преподаватель курса системного программирования, который я беру, сказал нам сегодня, чтобы определить структуру с массивом нулевой длины в конце:
struct array{
size_t size;
int data[0];
};
typedef struct array array;
Это полезная структура для определения или инициализации массива с переменной, то есть следующим образом:
array *array_new(size_t size){
array* a = malloc(sizeof(array) + size * sizeof(int));
if(a){
a->size = size;
}
return a;
}
То есть, используя malloc()
, мы также выделяем память для массива нулевого размера. Это совершенно новое для меня, и это кажется странным, потому что, по моему мнению, структуры не имеют своих элементов в непрерывных местах.
Почему код в array_new
выделяет память на data[0]
? Почему это было бы законным для доступа, скажем
array * a = array_new(3);
a->data[1] = 12;
?
Из того, что он сказал нам, кажется, что массив, определенный как длина нуля в конце структуры, гарантируется сразу после последнего элемента структуры, но это кажется странным, потому что, опять же, из моего понимания, у структур может быть отступы.
Я также видел, что это всего лишь функция gcc и не определен никаким стандартом. Это правда?