Если вы объявите массив как
T a[N]; // assume N is a constant expression
, тогда a
может содержать только N
элементов типа T
- не больше, не меньше.Вы не можете добавлять дополнительные элементы в массив и не можете удалять элементы из массива.
Однако ...
C не вызывает проверку границ при подписке массива, поэтому возможно, что вы можете читать или писать после конца массива, например
a[N + 2] = x;
Поведение при этом: undefined - ваша программа может работать должным образом, или она может сразу аварийно завершиться, или вы можете повредить другие объекты в программе.Среда выполнения (скорее всего) не будет генерировать исключение типа IndexOutOfBounds.
Существует вещь, называемая массивом переменной длины , который был добавлен в C99, где размер массива не является константным выражением:
size_t size = some_value();
T a[size];
Массивы переменной длиныимеют только переменную длину в том смысле, что их размер не определяется до времени выполнения - однако после определения их размер фиксируется на протяжении всего срока их службы, и, как и обычные массивы, они не могут увеличиваться при добавлении новых элементов.
Если вы динамически выделяете кусок памяти, используя
T *a = malloc( sizeof *a * some_size );
, тогда вы можете увеличивать или уменьшать этот кусок памяти, используя realloc
:
T *tmp = realloc( a, sizeof *a * (some_size * 2) );
if ( tmp )
{
a = tmp;
some_size *= 2;
}