devuelve valores múltiples de una función en C [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Puntero perdiendo su valor + execv aviso de compilación 1 respuesta

mi problema original es que quiero escribir una función que me pueda devolver dos valores. Sé que puedo hacerlo pasando la dirección de los dos argumentos a la función y directamente calculo sus valores dentro de esa función. Pero al hacer un experimento, sucede algo extraño. El valor que obtuve dentro de la función no puede sobrevivir a la función principal:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void build(char *ch){
   ch = malloc(30*sizeof(char));
   strcpy(ch, "I am a good guy");
}

void main(){
   char *cm;
   build(cm);
   printf("%s\n", cm);
}

El programa anterior simplemente imprime algo de basura. Así que quiero saber qué está mal aquí. Eventualmente, quiero algo como estoparse(char **argv, char **cmd1, char **cmd2), que puede analizar dos comandos para mí desde el comando original argv. Eso sería genial si alguien puede explicar un poco. Muchas gracias.