Asigne memoria y guarde la cadena en c

Me preguntaba por qué el siguiente código no funciona

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     test = "testingonly";
     free(test);
}

Después de pensarlo, supuse que primero asigno espacio para 12 caracteres en la memoria, pero la asignación en la siguiente línea crea una matriz de caracteres en la pila y la dirección de la memoria se pasa a prueba. Entonces free () intenta liberar espacio en la pila que no está permitido. ¿Es eso correcto

Entonces, ¿cuál sería el enfoque correcto para guardar una cadena en el montón? ¿Es la siguiente una forma común?

int main(int argc, char **argv)
{
     char *test = (char*) malloc(12*sizeof(char));
     strcpy(test, "testingonly");
     free(test);
}

Respuestas a la pregunta(12)

Su respuesta a la pregunta