Функция, возвращающая указатель на массив

Мне удалось работать с массивами переменной длины вC и теперь у меня есть следующее:

#include <stdio.h>
#include <stdlib.h>

int (*foo(size_t row, size_t col))[3];

int main(void){
    size_t row, col;


    printf("Give the ROW: ");
    if ( scanf("%zu",&row) != 1){
        printf("Error, scanf ROW\n");
        exit(1);
    }

    printf("Give the COL: ");
    if ( scanf("%zu",&col) != 1){
        printf("Error, scanf COL\n");
        exit(2);
    }

    int (*arr)[col] = foo(row, col);

    for ( size_t i = 0; i < row; i++){
        for( size_t j = 0; j < col; j++){
            printf("%d ",*(*(arr+i)+j));
        }
    }

    free(arr);
}


int (*foo(size_t row, size_t col))[3]{
    int (*arr)[col] = malloc(row * col * sizeof(int));
    int l=0;

    if (arr == NULL){
        printf("Error, malloc\n");
        exit(3);
    }

    for ( size_t i = 0; i < row; i++){
        for( size_t j = 0; j < col; j++){
            *(*(arr+i)+j) = l;
            l++;
        }
    }

    return arr;
}

Выход:

Give the ROW: 2
Give the COL: 5
0 1 2 3 4 5 6 7 8 9

Теперь это:

int (*foo(size_t row, size_t col))[3]{ /* code */ }

означает, если я правильно понял, что объявляет foo как функцию с двумя параметрами (size_t row, size_t col), которая возвращает указатель на массив 3 из int.

Я не совсем способен понять такого рода функции, и теперь мне сложнее работать с массивами переменной длины, когда размер известен только во время выполнения, но я считаю это хорошей вещью. Я работаю только сC11 стандарт.

Любой способ здесьint (*foo(size_t row, size_t col))[3] У меня есть [3], который мне не совсем понятен о том, как это работает и как я могу сделать это возможным во время выполнения (конечно, только если это возможно), что-то вродеint (*foo(size_t row, size_t col))[SIZE].

Я прочитал несколько книг оC, но нет точных объяснений этой ситуации, и Google тоже не помогает, поэтому у меня есть два вопроса:

1) это возможноint (*foo(size_t row, size_t col))[SIZE] где РАЗМЕР должен быть параметром? Или я должен объявить эту функцию по-другому?

2) это правильный путь для того, что я здесь пробовал, или есть другая альтернатива?

Я только пытаюсь вернуть указатель на массив, размер которого известен во время выполнения, а не во время компиляции. Зовmalloc а такжеfree происходит только один раз, и это хороший подход, потому что всякий раз, когдаmalloc наша программа мешает ядру выделить память и пометить страницу как доступную для записи. Так что у этого метода меньше накладных расходовkernel, Это может быть написано в одномmalloc работа с VLA

РЕДАКТИРОВАТЬ:

@ChronoKitsune сказал, что я должен использовать / попробовать[] (массив неопределенного размера), в этом случае функция станет такой:

int (*foo(size_t row, size_t col))[]{ /* code */ }

Это то, что я должен использовать?

Ответы на вопрос(1)

Ваш ответ на вопрос