Liberar malloc no borrará los datos de char

Hice un escenario más pequeño de mi mayor problema. Lo que trato de hacer es pasar una cadena a una función que haga una nueva cadena. Sin embargo, me encontré con algunos problemas.

He definido una cadena como

typedef char string[1024];

Entonces tengo una función que toma una cadena y crea una nueva cadena que se llena con la cadena anterior y un punto char

string* add_sth_to_string(char* msg){
    string* newStr=malloc(sizeof(string)); // malloc a newStr
    strcpy(*newStr, msg);            // copying msg to newStr

    char buff[1024];                 // making a buffer
    strcat(buff, ".");               // adding a dot to buffer
    strcat(buff, *newStr);           // adding msg   to buffer
    strcpy(*newStr, buff);           // copying buffer to newStr
    return newStr;
}

Entonces, en principal, trato de usar esta función 3 veces para una nueva cadena cada vez:

for (i=0; i<3; i++){
    string* newStr;
    newStr=add_sth_to_string("test");
    printf("str: %s\n", *newStr);
    free(newStr);
    // can even printf here
}

Este es el resultado extraño que obtengo:

str: .test
str: .test.test
str: .test.test.test

Cuando esperaría obtener:

str: .test
str: .test
str: .test

¿Alguien que pueda señalar lo que está sucediendo? Algo más que encuentro extraño es que puedo imprimir el valor de newStr justo después de tenerliberad eso

Respuestas a la pregunta(4)

Su respuesta a la pregunta