Se è agevole, posta tutto il programma, possibilmente fornendo anche il contenuto di un file di prova.
Nel frattempo, questo è un esempio funzionante di qualcosa di simile.

* ometto, per semplicità, il controllo di tutti gli errori possibili;
* il passaggio del puntatore triplo alla funzione wrapper() può ovviamente essere "propagato" alla funzione allocate() senza che questa debba necessariamente restituire il valore di un puntatore dichiarato localmente

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

#define STRLEN  20

char **allocate(int num)
{
    char **m = NULL;
    int i;

    m = malloc(sizeof(char *) * num);
    for (i = 0; i < num; i++) {
        m[i] = malloc(sizeof(char) * STRLEN);
    }

    return m;
}

int wrapper(char ***m)
{
    int num = 10, i;

    *m = allocate(num);
    for (i = 0; i < num; i++) {
        printf("insert string number %d\n", i+1);
        fgets((*m)[i], STRLEN, stdin);
    }

    return num;
}

int main(void)
{
    char **m = NULL;
    int num, i;

    num = wrapper(&m);
    puts("*** strings ***");
    for (i = 0; i < num; i++) {
        puts(m[i]);
    }
    for (i = 0; i < num; i++) {
        free(m[i]);
    }
    free(m);

    return 0;
}