Título: Problema al liberar memoria con free() Publicado por: mester en 21 Mayo 2016, 04:19 am Hola.
Estoy haciendo una shell y de momento va bien xd el problema surge cuando quiero liberar la variable que contiene los argumentos. Adjunto codigo: Código
Con esta función se recibe un comando. Y este sería el main: Código
El problema surge con el free(stdLine); que a la hora de imprimirlo se ve que se llena de basura o algo así, porque cuando se ejecuta el printf del main me saca carácteres raros al final de cadena que impiden que sea bien leida. He pensado en poner stdLine = NULL; pero lo que quiero es liberar memoria. ¿Sería lo mismo poner free(stdLine) que stdLine = NULL? Yo creo que no, pero como no me dedico a la programación profesionalmente, sino más por afición, pues no tengo mucha idea. Gracias de antemano. Título: Re: Problema al liberar memoria con free() Publicado por: AlbertoBSD en 21 Mayo 2016, 06:04 am trata de usar calloc en lugar de malloc malloc te da memoria no inicializada en 0 y calloc si lo hace.
Trata de siempre pedir un byte mas de lo que necesitas para dejar un byte nullo al final. Asi quedaria Código Veo que estas separando por cada espacio por que no usas strtok? Un ejemplo seria el que mostre en el siguiente tema. https://foro.elhacker.net/programacion_cc/mi_programa_crashea_al_usar_strtok-t452597.0.html te dejo un video que he hecho para que veas la diferencia. iBf7AThP1w8 saludos Título: Re: Problema al liberar memoria con free() Publicado por: mester en 21 Mayo 2016, 10:54 am Veo que estas separando por cada espacio por que no usas strtok? Porque prefiero usar funciones mías. Una cosa, es lo mismo si hago esto: Código Que si hago esto: Código
Y otra cosa... ¿Como puedo saber si un puntero está apuntando a alguna direccion de memoria? Porque por ejemplo puedo declararlo pero no inicializarlo, y despues al liberarlo me da una violacion de segmento. Gracias. Título: Re: Problema al liberar memoria con free() Publicado por: AlbertoBSD en 21 Mayo 2016, 13:34 pm [
Porque prefiero usar funciones mías. Una cosa, es lo mismo si hago esto: Y otra cosa... ¿Como puedo saber si un puntero está apuntando a alguna direccion de memoria? Porque por ejemplo puedo declararlo pero no inicializarlo, y despues al liberarlo me da una violacion de segmento. Gracias. Yo tambien prefiero usar funciones propias para aprender los algoritmos y en general saber lo que esta haciendo el codigo. Tienes que hacer una validaciones.. Código
Código
Este es el correcto... tienes que liberar primero los apuntadores individuales y despues el doble apuntador.. y validar antes que no sean NULL. ahora tambien ten cuidado de no liberar 2 veces un mismo apuntador ahi marcaria error.. Título: Re: Problema al liberar memoria con free() Publicado por: mester en 21 Mayo 2016, 13:41 pm Vale, ya me ha quedado claro, gracias por la ayuda, camarada.
Título: Re: Problema al liberar memoria con free() Publicado por: ivancea96 en 21 Mayo 2016, 13:52 pm Código
Lo ideal, es que vayas poniendo un '\0' al final de cada cadena. Es interesante ver que no tienes forma de saber el numero de argumentos del comando. Tendrás que devolver tambien un entero. En cuanto al código, reorganicé para 2 cosas: -1: poner los '\0' -2: no anexar el espacio a las cadenas. Para eso el 'else'. Por lo demás, estaría bien que primero calculases la cantidad de argumentos que tiene la cadena, y luego hicieras los malloc. Sinó, tendrás un montón de memoria perdida. Título: Re: Problema al liberar memoria con free() Publicado por: mester en 21 Mayo 2016, 14:04 pm En cuanto al código, reorganicé para 2 cosas: siii, eso ya lo tenía puesto en el codigo, es que este no lo he actualizado. A ver que te parece este:-1: poner los '\0' -2: no anexar el espacio a las cadenas. Para eso el 'else'. Por lo demás, estaría bien que primero calculases la cantidad de argumentos que tiene la cadena, y luego hicieras los malloc. Sinó, tendrás un montón de memoria perdida. Código
Pongo lo del & porque al ser una shell, el & indica que el proceso será ejecutado en background y tal. Y en cuanto a la funcion seastr() es una funcion propia que busca en una cadena y devuelve ciertos valores: Código
Si ves algo que se podría mejorar de ahí, por favor, dimelo. Gracias. Título: Re: Problema al liberar memoria con free() Publicado por: AlbertoBSD en 21 Mayo 2016, 14:35 pm Todo bien ;-) ;-) ;-)
Solo como comentario... Código el sizeof(char) en el primer parametro esta sobrado por que se especifica en el segundo parametro... Ahora el segundo calloc estas reservando memoria para X cantidad de apuntadores entonces el sizeog(char) le falta el * dentro del parentesis para que te reserve elementos del damañao de un apuntador usualemnte son elementos de 4 u 8 bytes.. Sobre la variable maxLength no estoy seguro de cuanto valga pero si alguien mete mas comandos que maxLength puede hacer tu app vulnerable a buffer overflow.... Pero solo es una observacion para alguien que esta aprendiendo por hobby te tengo que decir que dominas el lenguaje con cierta maestria... Saludos! |