Man darf die Funktion beliebig aufrufen. Das Problem liegt doch allein in der Zuweisung, die du nach dem Aufruf machst. Dieser Code läuft ohne Probleme:
char *string = malloc(12 * sizeof(char));
strcpy(string," Hallo ");
char* foo = trim(string);
free string; [/code]
(Mit der Einschränkung, dass man foo nicht mehr benutzen darf, wenn string nicht mehr da ist, aber das halte ich für unproblematisch.)
So, wie du das benutzt, gibt es mit [i]jeder [/i]Funktion Probleme, die nicht den Parameter free-t und den Rückgabewert malloc-t, was IMHO ein sehr ungewöhnliches Verhalten für Funktionen wäre.