Falha de segmentação - C [duplicado]

Esta questão já tem uma resposta aqui:

Falha de segmentação ou "falha de segmentação" quando os dados são copiados / digitalizados / lidos para um ponteiro não inicializado 4 respostas

Por que o código a seguir retorna com uma falha de segmentação? Quando eu comentar a linha 7, a falha seg desaparece.

int main(void){
      char *s;
      int ln;
      puts("Enter String");
      // scanf("%s", s);
      gets(s);
      ln = strlen(s); // remove this line to end seg fault
      char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
      dyn_s = s;
      dyn_s[strlen(s)] = '\0';
      puts(dyn_s);
      return 0;
    }

Felicidades!

questionAnswers(5)

yourAnswerToTheQuestion