Por que c permite a inicialização da string sem declaração?

Quando os argumentos de dyn_mat são constantes, o código é executado sem qualquer erro e s1 e s2 armazenam os valores de entrada.

#include<stdio.h>

int main(int argc, char const *argv[])
{
    char *s1, *s2;
    int n1=7, n2=8;
    printf("Enter, %d \n", n1);

    scanf("%s", s1);
    scanf("%s", s2);

    int dyn_mat[155][347];

    return 0;
}

mas com argumentos como variáveis, digamos n1 e n2, a leitura scanf s1 fornece falha de segmentação.

questionAnswers(2)

yourAnswerToTheQuestion