Я объявил много указателей на массив переменной длины (VLA) в функции для динамического распределения двумерных массивов; например,
int M, N; // have some value
double (*arr1)[N] = calloc(M, sizeof(double [N]));
double (*arr2)[N] = calloc(M, sizeof(double [N]));
double (*arr3)[N] = calloc(M, sizeof(double [N]));
... // so many declarations
Поскольку функция стала очень длинной, я попытался разбить ее на несколько функций, каждая из которых требует в качестве аргумента все эти указатели. Вместо того, чтобы передавать много вещей в функцию (что плохо для производительности), я объявил структуру, содержащую все указатели глобально, чтобы уменьшить количество аргументов:
struct ptrpack {
int M, N;
double (*arr1)[N];
double (*arr2)[N];
...
};
// then each function just takes a single struct rather than many pointers
void foo(struct ptrpack p) {
...
}
Однако указатель на VLA не допускается в struct. Расширение G CC допускает это, если определение структуры находится в функции, но в моем случае определение находится в глобальной области.
Какое лучшее решение этой проблемы? Я настоятельно предпочитаю использовать указатель на VLA, а не обычный указатель.