Crear una estructura asignada dinámicamente con una cadena 2D asignada dinámicamente

Estoy tratando de escanear en una cuadrícula de letras.cases es el número de cuadrículas de letras yr, c son para el número de filas y columnas de cada cuadrícula. Pensé que podría crear una matriz de estructuras con matrices 2D dentro. He estado trabajando en esto durante unas horas y todavía me da problemas:

Advertencias:

Advertencia C4477 (Línea 12) -‘Scanf_s’: la cadena de formato ‘% s’ requiere un argumento de tipo ‘char *’, pero el argumento variable 1 tiene el tipo ‘int’Advertencia C4473 (Línea 12) -‘Scanf_s’: no se pasan suficientes argumentos para la cadena de formato

Errores:

Error de compilador C2274

Error de compilador C2461

El código:

scanf_s("%d", &cases);
struct grid { 
    char **grid; 
};
struct grid *grids = (struct grid*)malloc(cases * sizeof(struct grid));

for (i = 0; i < cases; i++) {
    scanf_s("%d %d", &r, &c);
    grids[i].grid = (char**)malloc(sizeof(char*) * r);
    for (k = 0; k < r; k++) {
        grids[i].grid[k] = (char*)malloc(sizeof(char) * (c+1));
        scanf_s("%s", grids[i].grid[k], (c+1));
    }           
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta