Конечно, вы можете сделать это. Не уверен, что я бы назвал это лучшей практикой, но, безусловно, было бы неплохо сделать довольно простые элементарные массивы Си более управляемыми. Если вам нужны динамические массивы, почти необходимо сгруппировать различные поля, необходимые для ведения бухгалтерского учета.
Иногда в этом случае у вас есть два размера: один текущий и один выделенный. Это компромисс, когда вы торгуете меньшим количеством выделенных ресурсов для некоторой скорости, платя с небольшим объемом памяти.
Часто массивы используются только локально и имеют статический размер, поэтому оператор sizeof
так удобен для определения количества элементов. Ваш синтаксис немного отличается от этого, кстати, вот как это обычно выглядит:
int array[4711];
int i;
for(i = 0; i < sizeof array / sizeof *array; i++)
{
/* Do stuff with each element. */
}
Помните, что sizeof
не является функцией, скобки не всегда нужны.
РЕДАКТИРОВАТЬ : Один из реальных примеров обертки, точно такой, который вы описываете, - это тип GArray , предоставляемый glib . Видимая пользователем часть объявления - это именно то, что вы описываете:
typedef struct {
gchar *data;
guint len;
} GArray;
Предполагается, что программы будут использовать предоставляемый API для доступа к массиву, когда это возможно, а не для непосредственного использования этих полей.