Funcion que retorne char array?

Iniciado por juancaa, 19 Julio 2012, 01:43 AM

0 Miembros y 1 Visitante están viendo este tema.

leogtz

Cita de: fMtQr en 19 Julio 2012, 03:17 AM
Gracias por vuestras respuestas!
Respecto al codigo de Leo Gutiérrez. me sigue dando errores de compilacion :

test.cpp: In function 'char* func()':
test.cpp:5:24: error: invalid conversion from 'void*' to 'char*' [-fpermissive]


Utilizando el metodo de avesudra logro compilar el codigo pero la salida no acaba de cuadrar :

Introduce word = casa
Result = casa╠■(.


Aunque ahora ya puedo devolver el array la salida devuelve caracteres que no se de donde salen... Alguna idea de como solucionar esto??
Muchas gracias por vuestra ayuda!!

A mi código agregale un (char *) antes del malloc, algo así:

(char *)malloc(....)

El compilador no debería de pedirlo, es extraño.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

DickGumshoe

#11
CitarA mi código agregale un (char *) antes del malloc, algo así:

(char *)malloc(....)

El compilador no debería de pedirlo, es extraño.

A mí siempre me ha pedido el (char*) antes de usar malloc(). Creo (o supongo, no lo sé seguro) que es para que el compilador sepa si lo que quieres que tenga 20 elementos es el vector, o en el caso de las matrices; si hay 20 columnas o 20 filas.

Por otra parte, yo siempre he usado:

variable = (char *) malloc (20 * sizeof(char));

Creo que es necesario poner también el sizeof(char) para que sepa que tiene que reservar el espacio de 20 char, al menos así lo vi yo por los libros a partir de los que aprendí C.

Saludos!

do-while

¡Buenas!

Ya te han dado varias soluciones, voy a intentar darte una explicacion de porque no funcionaba tu codigo.

No se si sabes lo que es la pila de un programa. Es una parte de la memoria en la que se van acumulando datos de llamadas a funciones, alli se ponen, entre otras cosas, los parametros que pasas a las funciones y el valor de retorno. Una vez que se sale de la funcion, se "recupera" la memoria que se ha utilizado, incluida la que utilizan las variables locales, por lo tanto, como ya han dicho en alguno de las respuestas, los valores que contienen se pueden perder. Esto quiere decir que si devuelves un puntero a una variable que se encuentre dentro de una funcion, lo que estas devolviendo, en principio, es un puntero a alguna parte de la pila, que esta modificandose de forma continua. De ahi la "basura" que encuentras.

Tienes varias formas de solucionar el problema (que yo sepa 4 evidentes... ¿Alguien da mas?), dos muy parecidas, una de ellas ya te la han dado.

Puedes asignar memoria a un puntero local, esto no se perdera, ya que estaras devolviendo un valor a una posicion de memoria no de la pila, sino del heap.

Otra opcion es pasar a la funcion una cadena desde la funcion llamadora.

Si en principio no sabes cuanto va a ocupar el vector (porque por ejemplo ese dato lo obtienes dentro de la funcion) tambien puedes pasar en la lista de parametros un puntero a un puntero y actuar como en el primer caso, asignando la memoria de forma dinamica.

Y para terminar, puedes declarar la variable dentro de la propia funcion como static, de esta forma, cuando salgas de la funcion te aseguraras de que mantiene la informacion, pero esta cambiara de una llamada a otra, por lo que despues de cada llamada tendras que guardar o procesar inmediatamente el dato para que en posteriores llamadas no pierdas informacion que te pueda interesar.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: DickGumshoe en 19 Julio 2012, 09:43 AM
A mí siempre me ha pedido el (char*) antes de usar malloc().
Si compilas como C no debe pedirte la conversión, ella es automática.
Si compilas como C++ la conversión es obligatoria.


Cita de: DickGumshoe en 19 Julio 2012, 09:43 AM
Por otra parte, yo siempre he usado:

variable = (char *) malloc (20 * sizeof(char));

Creo que es necesario poner también el sizeof(char) para que sepa que tiene que reservar el espacio de 20 char, al menos así lo vi yo por los libros a partir de los que aprendí C.
No es necesaria esa multiplicación ya que "sizeof(char)" siempre es igual a uno.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language