Any comments / corrections?
In the C89 standard, an array must be set with a constant. Which would not allowed what you just did.
int cantidad_frases = 0;
printf("Cuantas frases quieres escribir?: ");
scanf("%d", &cantidad_frases);
getchar();
char *frases[cantidad_frases]; /* This is not allowed in C89 */
Furthermore, there can not be mixing of variable declarations and code. All variable must be declared first in the block. Making char *frases[cantid_frases]; incorrect as well.
If you want dynamically allocated multidimensional arrays you may take a look at pointer to pointer.
Example
C89 doesn't accept declaration of variable in the for loop construct.
for(unsigned i = 0; i < cantidad_frases; i++)
Variable i must be declared outside the ().
When you ask for user input, the control of the program is handled to the user. They can enter an integer (in which case an enter key has been added to the stream), they can enter a float, a char or any combination and length of those. Moreover they might just press enter or be generous with blank sequence.
Can scanf() handle that kind of conditions? The answer is no. The elegant option then is to think how would you deal with the input and design your program to accommodate for those possibilities. There's not "silver-bullet function" that will do that for you.