Причина, по которой оператор sizeof работает не так, как вы ожидаете, состоит в том, что массив «распадается» на указатель при передаче его функции:
int array[5];
printf("%d\n", sizeof(array) / sizeof(int)); /* prints 5 */
/* ... */
void some_function(int array[])
{
printf("%d\n", sizeof(array) / sizeof(int)); /* prints 1, no matter what */
}
Как и для определения ваших массивов, в старыхверсии C, массивы переменной длины не допускались (обратите внимание, что Visual Studio все еще реализует эту старую версию C).Вы должны были указать постоянный размер:
const size_t some_size = 22;
size_t some_other_size = 5;
int array1[5]; /* okay */
int array2[some_size]; /* okay */
int array3[some_other_size]; /* not okay - not const */
Более новые версии C (компиляторы, которые реализуют стандарт C99) позволяют указывать переменный размер:
size_t some_other_size = 5;
int array3[some_other_size]; /* okay - VLA */
В качестве примечанияНи одна версия стандарта C ++ не включала поддержку VLA.Однако некоторые компиляторы C ++ реализовали свои собственные расширения (см. Комментарий Groxx).
Если вы хотите выделить переменное количество непрерывной памяти в компиляторе C, который не поддерживает VLA, вы должны использовать malloc ибесплатно, как предположил Кбримингтон:
size_t size = 5;
int* array = (int*)malloc(sizeof(int) * size);
/* use array */
free(array);