Estoy enfrentando un comportamiento extraño con una variable char*
user_message* parseMessage(char *incoming_msg, uint64_t size) { user_message* msg = calloc(1, sizeof(user_message)); printf("value: %s\n", incoming_msg); return msg; } void start_server() { char* msg = "1|david|pwd|"; printf("msg: %s\n", msg); parseMessage(&msg, 12); }La salida :
msg: 1|david|pwd| value: �[Lucho por descubrir qué está mal en mi código.
parseMessage(&msg, 12); debe ser parseMessage(msg, 12);
El &msg significa que está pasando un puntero a msg, que será un char ** cuando la función solo toma un char *
El primer parámetro de la función parseMessage y la expresión utilizada como argumento para este parámetro tienen tipos diferentes.
El parámetro se declara con el tipo char *
user_message* parseMessage(char *incoming_msg, uint64_t size) mientras que la expresión utilizada como argumento tiene el tipo char ** .
char* msg = "1|david|pwd|"; //... parseMessage(&msg, 12); Entonces, de hecho, en lugar de generar la cadena a la que apunta el puntero msg , está tratando de generar como una cadena lo que está almacenado en la memoria ocupada por la variable msg y lo que le sigue
Necesitas llamar a la función al menos como
parseMessage( msg, 12 ); También sería mejor al menos declarar el primer parámetro de función con el calificador const si la cadena pasada no se cambia dentro de la función.
user_message* parseMessage( const char *incoming_msg, uint64_t size);&msg produce un char ** o un puntero a puntero a char .
Tanto su función parseMessage como el especificador printf %s esperan un char * .
No necesita la dirección del operador aquí
parseMessage(msg, 12);