¿Puedo copiar una cadena en una cadena vacía?

Supongamos que me gusta esto para copiar la cadena.

char str[] = "";
char *str2 = "abc";
strcpy(str, str2);
printf("%s", str);  // "abc"
printf("%d", strlen(str));  // 3

Entonces, ¿por qué no me da un comportamiento indefinido o hace que el programa falle? ¿Cuáles son las desventajas de hacer así?

Respuestas a la pregunta(3)

Su respuesta a la pregunta