не работает. По крайней мере, не надежно. Это неопределенное поведение , так как вы обращаетесь к памяти вне массива. Если вы не выходите слишком далеко за пределы массива, он часто работает, но делать это очень опасно, и то, как вы его обрабатываете, неприемлемо ни при каких обстоятельствах.
Если вам нужно изменить размер, используйте динамическое распределение следующим образом:
int *a = malloc(n*sizeof(*a));
if (!a) { /* Handle error */ }
и затем:
n=n+1;
// Using a void pointer, because this pointer should not be used for
// dereferencing
void *tmp = realloc(a, n*sizeof(*a));
if (!tmp) { /* Handle error */ }
a = tmp;
На самом деле, я бы предпочел динамическое распределение вместо использования VLA: s в любой день. Тот факт, что они сняли требование к компиляторам поддерживать их в стандартах современного C, является хорошим признаком того, что их использование является плохой идеей. А поскольку их поддержка больше не является обязательной, их использование МОЖЕТ нарушить ваш код в будущем.