gets () нуждается в буфере для помещения строки, но вместо этого вы передаете ей неинициализированный указатель.Также, как уже упоминалось, вы не должны использовать его в новом коде.fgets (str, len, stdin) будет делать то же самое, но не переполнять буфер.
пример:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100], str2[100], str3[200];
puts("Enter first string: ");
fgets(str1, 100, stdin);
puts("Enter second string: ");
fgets(str2, 100, stdin);
printf("Before concatenation the strings are\n%s\n%s\n", str1, str2);
memset(str3, 0, 200);
strncat(str3, str1, 200);
strncat(str3, str2, 200);
printf("After concatenation the strings are\n%s\n", str3);
return 0;
}