C99 имеет простой инструмент, который часто не одобряется, но служит именно тем, что вы хотите, массивами переменной длины, VLA.
void populateMatrix(size_t y, size_t x, double matrix[x][y]);
Причина, по которой они осуждаются, заключается в том, что если вы используете их напрямую для размещения матриц в стеке, вы можете наблюдать переполнение стека. Вы можете избежать этого, фактически передав указатели таким зверям:
void populateMatrix2(size_t y, size_t x, double (*matrix)[x][y]) {
for (... something ...) {
(*matrix)[i][j] = 33.0;
}
}
и в некоторых функциях:
double (*myMatrix)[n][m] = malloc(sizeof(*myMatrix));
populateMatrix2(n, m, myMatrix);
Для синтаксиса вам просто нужно, чтобы размер измерений был указан перед матрицей в списке параметров, чтобы они были известны в этой точке. Также используйте size_t
для всего, что является индексами и размерами объектов, обычно нет смысла иметь для них подписанный тип.