Если у вас есть компилятор C99, вам не нужно заново изобретать колесо, многомерные массивы, даже с динамическими границами, являются частью языка.
struct samp samp_arr[unknown][10][unknown];
(предположим, что unknown
- это выражение, которое оценивает значение по вашему вкусу.)
Однако обычно плохая идея размещать такую большую переменную в стеке, поэтому вы должны использовать malloc
и друзей для ее выделения:
struct samp (*samp_arr)[10][unknown] = malloc(sizeof(struct samp[unknown][10][unknown]));
...
// use it
samp_arr[i][j][k].a = ...
...
free(samp_arr);
Здесь объявляется указатель на двумерный массив.
Чтобы передать ваш массив функциям, которые вы можете выполнять аналогичным образом, вам просто нужно посмотреть, что границы массива стоят первыми в списке аргументов, чтобы они были известны, когда речь идет о самом массиве:
int fun(size_t r, size_t s, size_t t, struct samp (*A)[s][t]) {
...
}