Freeing malloc não apagará dados de caracteres

Eu fiz um cenário menor do meu maior problema. O que eu tento fazer é passar uma string para uma função que fará dela uma nova string. No entanto, tive alguns problemas.

Eu defini string como

typedef char string[1024];

Então eu tenho uma função que pega uma string e cria uma nova string que é preenchida com a string antiga e um caractere de ponto

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;
}

Em seguida, tentei usar esta função três vezes para uma nova string de 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
}

Esta é a saída estranha que recebo:

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

Quando esperaria obter:

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

Qualquer pessoa que possa apontar o que está acontecendo? Outra coisa que acho estranha é que posso imprimir o valor de newStr logo depois de ter liberado isto

questionAnswers(4)

yourAnswerToTheQuestion