It would crash simply because it's what (usually, the behavior is undefined) happens when you try to free a pointer that is not pointing at memory that can be freed. Read more about string literals here: https://stackoverflow.com/a/1704433/6699433
And both of your examples are very badly written, since the malloc is simply never used.
char* strings[100];
strings[0]=malloc(100);
char str[100]="AAA";
strings[0]=strdup(str);
free(strings[0]);
is equivalent to
char* strings[100];
char str[100]="AAA";
strings[0]=strdup(str);
free(strings[0]);
and
char* strings[100];
strings[0]=malloc(100);
strings[0]="AAA";
free(strings[0]);
is equivalent to
char* strings[100];
strings[0]="AAA";
free(strings[0]);
Note that "equivalent" is not 100% correct, since you have side effects. I just wanted to show that some lines are completely pointless since you don't use result before reassigning the variables.