s="hello";
Вы назначаете другой адрес для s, статически выделенной памяти.Освобождение это не правильно.Кроме того, поскольку вы делаете это, вы, по сути, теряете выделенную здесь память:
char* s = (char*) malloc(sizeof(char)*10);
Попробуйте:
int main()
{
static const size_t kBufferSize = 10;
char* s = (char*) malloc(sizeof(char) * kBufferSize);
strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting
// yourself from a buffer overflow
free(s);
}