C/Visual C - char **cadena... ¿como?

 
Vista:

char **cadena... ¿como?

Publicado por Ana Laura (1 intervención) el 03/06/2007 00:04:43
Hola a todos :)

Primero que nada, soy nuev, así que me disculpo por mi pregunta de novata ;)

Tengo que implementar una funcion, tipo callback, en C,... y estoy trabada en lo siguiente:

static void mensaje_cb(GWindow *feren, const char *who, char **message)

Lo que tengo hacer es liberar la memoria de message y crear uno nuevo...
Me explico mejor: si message apuntaba a una cadena "Hola Mundo", message tendrá despues: "Hello Wordl" por ejemplo.

Osea, sería liberar la memoria y con algún *alloc* o algo así crear una nueva string..

Y aqui es donde quedo, porque no se como hacerlo :(

Si alguien puede ayudarme... muchisimas gracias! :D
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:char **cadena... ¿como?

Publicado por Tom (610 intervenciones) el 04/06/2007 11:19:39
No sé en Visual, pero en C es muy fácil:

char *nmsg = "nuevo Mensaje";
free(*message);
*message = nmsg;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:char **cadena... ¿como?

Publicado por fernando.gomez (1604 intervenciones) el 04/06/2007 16:48:39
Mmm... al parecer no es tan fácil, porque si esas líneas de código las pones dentro de una función -como Laura sugiere- crearías un comportamiento indefinido. Esto, porque la variable estática "nuevo Mensaje" se destruiría al finalizar la función, causando que nmsgr apunte a una dirección de memoria inválida. Para ello es mejor emplear un strcpy. Ahora, si la función tiene que ubicarle memoria dinámica, sería necesario manejar malloc y free. Si no, no es necesario.

// sin uso de memoria dinámica
void mensaje_cb(GWindow *feren, const char *who, char **message)
{
...
strcpy(*message, "nuevo mensaje");
}

// con uso de memoria dinámica
void mensaje_cb(GWindow *feren, const char *who, char **message)
{
...
if (*mesage)
free(*message);

*message = malloc(sizeof(char)*num_caracteres);
strcpy(*message, "nuevo mensaje");
...
}

Claro, también podrías llamar a calloc o realloc, según convenga.

Finalmente, ¿por qué la variable tiene que ser un doble puntero a caracter? ¿No es suficiente con uno solo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:char **cadena... ¿como?

Publicado por Tom (610 intervenciones) el 05/06/2007 08:02:54
Bueno, era sólo un ejemplo.

No sé en Visual, pero desde luego con gcc o con CC la cadena "nuevo Mensaje" no se destruirá al salir de la función, precisamente por ser estática.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:char **cadena... ¿como?

Publicado por fernando.gomez (1604 intervenciones) el 05/06/2007 19:27:28
Bueno, yo tampoco sé de Visual C++, yo estaba habladno del estándar de C...

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:char **cadena... ¿como?

Publicado por Tom (610 intervenciones) el 06/06/2007 11:12:54
¿ Dónde has leído eso del standard ?

Porque hay cosas, como la llamada "tabla de cadenas", cuya gestión es un estándar "de facto" (ya sabes, no está escrito pero todo el mundo lo usa).

Prueba este simple programa, también de ejemplo:

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

void cambiaCadena(char **test);

/* */
int main(int argc, char *argv[]) {
char *test;
test = strdup("Oye tronco como ronco");

printf("Antes : \"%s\"\n", test);
cambiaCadena(&test);
printf("Después: \"%s\"\n", test);
}
/* */
void cambiaCadena(char **test) {
*test = "volumen brutal";
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:char **cadena... ¿como?

Publicado por preguntare siempre a google (1 intervención) el 08/11/2007 16:14:01
www.google.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar