Título: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: Miky Gonzalez en 20 Marzo 2013, 20:19 pm Voy a ir directo: tengo una función en C que me provoca un fallo de segmentación. He revisado y creo que los punteros están bien colocados y no devería de acceder a recursos de memoria no-accesibles.
Código
Elimina los espacios de una cadena. Saludos! Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: amchacon en 20 Marzo 2013, 21:10 pm El fallo está en la condición del while:
Código Esa condición siempre va a ser cierta, incluso aunque se sobrepase la cadena (no tienes garantía que haya un NULL al final!). Está es la alternativa que te propongo: Código
Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: x64core en 20 Marzo 2013, 21:46 pm El fallo está en la condición del while: Que quieres decir que la condición while es incorrecta?Código Esa condición siempre va a ser cierta, incluso aunque se sobrepase la cadena (no tienes garantía que haya un NULL al final!). Está es la alternativa que te propongo: Código
Igual si se le pasa a strlen una secuencia de bytes sin ninguna garantización que haya un null, también fallaria. o algun valor incorrecto, lo mejor seria depurar el codigo. Por cierto, si yo pasara una cadena con una longitud de 1000 con ningun espacio y el buffer reservado es de 255 bytes? mi version: Código
Comprueba cualquier tipo de valor incorrecto o no esperado, y para más seguridad podrias agregar un controlador de excepcion, debido a que podria aún darse una. Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: Khronos14 en 20 Marzo 2013, 22:15 pm amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena.
Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault. Código
Saludos. Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: x64core en 20 Marzo 2013, 22:46 pm amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena. Yo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault. Código
Saludos. ??? - Por cierto, alguien me puede explicar que es esto: Código: void eliminar_espacios(char *contenido_linea) { Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: amchacon en 20 Marzo 2013, 23:09 pm amchacon, el bucle está perfecto. Lo que hace es comprobar que el carácter actual es distinto de 0, que es el terminador de cadena. Estas añadiendo caracteres nulos en cada iteración? OoYo creo que el problema puede estar en que para cadena_temporal reservas 255 bytes y si contenido_linea tiene más caracteres = Segmentation Fault. Código
Saludos. Solo tienes que añadirselo al final. Por cierto, alguien me puede explicar que es esto: Pues es una buena pregunta, al pasar un cast como void nos quedaría algo así:Código: void eliminar_espacios(char *contenido_linea) { Código: void eliminar_espacios(char *contenido_linea) { Es decir, no devuelves nada. Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: x64core en 20 Marzo 2013, 23:20 pm Pues es una buena pregunta, al pasar un cast como void nos quedaría algo así: Código: void eliminar_espacios(char *contenido_linea) { Es decir, no devuelves nada. Seguro, yo realmente no entiendo lo que querian ellos hacer. - Por cierto, El codigo de Khronos14 genera una excepción. Título: Re: [C] Segmentation Fault - Fallo manejo de cadenas Publicado por: durasno en 21 Marzo 2013, 01:03 am Citar Elimina los espacios de una cadena. No, lo unico q hace es copiar los espacios en cadena temporal...El problema de fallo de segmentación se debe a que estas generando un "bucle infinito". Supongamos que tenemos la cadena "Hola mundo", usando tu funcion la condicion del if va a hacer verdadera hasta que contenido_linea apunte al espacio. Una vez que apunte al espacio se ejecuta el else, pero que sucede en el ciclo siguiente y en los posteriores??? contenido_linea va a seguir apuntando al espacio ya que no lo incrementas fuera del if, entonces solo se ejecuta el else y la condicion del while siempre es verdadero. Al entrar solo al else se incrementa permanentemente el puntero cadena_temporal provocando el "fallo de segmentación" Espero se haya entendido. Saludos |