Есть много похожих вопросов, но все же я не смог найти ответа, соответствующего функции массивов переменной длины в C99/C11.
Как передать массив многомерной переменной длины в функцию в C99/C11?
Например:
void foo(int n, int arr[][]) // <-- error here, how to fix?
{
}
void bar(int n)
{
int arr[n][n];
foo(n, arr);
}
Компилятор (g++-4.7 -std=gnu++11
) говорит: error: declaration of ‘arr’ as multidimensional array must have bounds for all dimensions except the first
Если я изменю его на int *arr[]
, компилятор все еще жалуется: error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘void foo(int, int**)’
Следующий вопрос, как передать его по значению и как передать его по ссылке? По-видимому, обычно вы не хотите, чтобы весь массив был скопирован, когда вы передаете его функции.
С массивами постоянной длины это просто, так как, как предполагает "константа", вы должны знать длину, когда объявляете функцию:
void foo2(int n, int arr[][10]) // <-- ok
{
}
void bar2()
{
int arr[10][10];
foo2(10, arr);
}
Я знаю, что передача массивов таким функциям не является лучшей практикой, и мне это совсем не нравится. Скорее всего, лучше делать с плоскими указателями или объектами (например, std: vector) или как-то иначе. Но все же, я немного любопытно, что здесь ответ с теоретической точки зрения.