Título: Devolver una cadena pasada como argumento a una funcion Publicado por: eduu15 en 9 Abril 2018, 01:26 am Citar tengo este code y el problema es que solo me imprime una h Código: #include <stdio.h> Citar Y porque este funciona? Código: #include <stdio.h> Título: Re: Devolver una cadena pasada como argumento a una funcion Publicado por: MAFUS en 9 Abril 2018, 01:43 am Unos pequeños cambios.
Código
Título: Re: Devolver una cadena pasada como argumento a una funcion Publicado por: eduu15 en 9 Abril 2018, 01:56 am Gracias
Título: Re: Devolver una cadena pasada como argumento a una funcion Publicado por: eduu15 en 9 Abril 2018, 02:32 am Modifique la pregunta añadi otro codigo que creo que funciona de suerte pero funciona
Título: Re: Devolver una cadena pasada como argumento a una funcion Publicado por: MAFUS en 9 Abril 2018, 03:18 am El segundo está mal hecho porque genera desbordamiento.
Devuelves un puntero (tipo de dato de 4 u 8 bytes, según arquitectura) sobre un char (tipo de dato de 1 byte). Por qué funciona Código: printf("%s",(&p)[1]); Esta parte depende de como el compilador sitúa las variables en la memoria. Te recomiendo que visites esto: http://www2.elo.utfsm.cl/~lsb/elo320/clases/c3.pdf La explicación rápida es: C ha situado ptr y p de forma contigua. Tu has hecho que ptr apunte a la cadena "hola" y mediante la función p también apuntará a "hola" (pero esa parte está mal hecha como ya te he dicho, hay desbordamiento por la diferencia de bytes entre los tipos de datos). Cuándo le das (&p)[1] a printf en verdad le estas dando ptr. %s necesita un puntero, p es un puntero, se lo podrías así, sin florituras. Pero le has añadido [1], supongo que lo has hecho y te ha marcado error, eso es porqué lo has dereferenciado y accedido al segundo carácter. En este momento el programa ha transformado el código ascii de 'o' y se lo ha dado a printf para que busque en esa posición de memoria (la 111 en decimal) para que busque allí una cadena pero el S.O. no le ha dejado y por eso ha fallado. Seguramente para arreglarlo habrás dicho 'pues transformo p en un puntero dándole incluyendo el operador de dirección (el &)'. Pero no has quitado el [1] y esto a generado lo siguiente: Con & has conseguido la dirección de p, es decir su puntero, y al usar los corchetes lo has dereferenciado. Si hubieras usado (&p)[0] habrías conseguido p que se lo habrías pasado a printf y habría mostrado la cadena por p, pero al mover el offset 1 byte con el [1] (se ha movido 1 byte porqué p es un puntero a char) has apuntado a la variable ptr, que es contigua. Como se ha dereferenciado, por lo comentado antes, printf la ha aceptado y por el hecho de que apunta a la misma cadena parece que el programa ha funcionado. En verdad lo que has tenido es mucha suerte. Por eso, y para evitarte estos errores e ir moviéndote a ciegas por el tema de los punteros léete el PDF que te he pasado. P.D.: Siguiendo con lo que te dije el otro día sobre lo de editar los posts: Si hay respuesta de otra persona sigue en una respuesta nueva. Solo edita el mismo post si vas a añadir algo pero nadie te ha respondido. |