dlaczego c pozwala na inicjalizację ciągu bez deklaracji?

Gdy argumenty dyn_mat są stałymi, kod działa bez żadnego błędu, a s1 i s2 przechowują wartości wejściowe.

#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;
}

ale z argumentami jako zmiennymi, powiedzmy n1 i n2, odczyt scanf s1 daje błąd segmentacji.

questionAnswers(2)

yourAnswerToTheQuestion