You declared a pointer to a string literal
char *st = "Addison,Jayden,Sofia,Michael,Andrew,Lily,Benjamin";
You may not change string literals. Any attempt to changve a string literal results in undefined behavior.
From the C Standard (6.4.5 String literals)
7 It is unspecified whether these arrays are distinct provided their
elements have the appropriate values. If the program attempts to
modify such an array, the behavior is undefined
On the other hand, the standard C function strtok
changes the passed to it string.
From the C Standard (7.23.5.8 The strtok function)
4 The strtok function then searches from there for a character that is
contained in the current separator string. If no such character is
found, the current token extends to the end of the string pointed to
by s1, and subsequent searches for a token will return a null pointer.
If such a character is found, it is overwritten by a null character,
which terminates the current token. The strtok function saves a
pointer to the following character, from which the next search for a
token will start.
So substitute the declaration for
char st[] = "Addison,Jayden,Sofia,Michael,Andrew,Lily,Benjamin";
Also you declared an array of pointers that is not initialized.
char *name[7];
So this statement
strcpy(name[i], token);
also invokes undefined behavior.
Instead you could just write
name[i] = token;
And as the variable i contains the number of tfokens then in general this loop
for (int j = 0; j < 7; j++)
{
printf("%s\n", name[j]);
}
should be rewritten at least like (without using the magic number 7)
for (int j = 0; j < i; j++)
{
puts( name[j] );
}