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
char**GetCommand(int maxLength){/*Recibe un comando*/
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.
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.
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
char*stdBuffer = NULL;//Asignacion redundante pero ña agrego para fines didacticos...
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.
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.
siii, eso ya lo tenía puesto en el codigo, es que este no lo he actualizado. A ver que te parece este:
Código
char**GetCommand(int maxLength,int*numArgs,int*background){/*Recibe un comando*/
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
int seastr(constchar*str1 /*word*/,
constchar*str2 /*string*/){
/*Returns 0 if str1 is in str2*/
if(str1 == NULL||str2 == NULL){
return1;
}
char*cp =(char*)str2;
char*sr,*fr;
while(*cp){
sr = cp;
fr =(char*)str1;
while(*sr &&*fr &&(*sr ==*fr)){
sr++, fr++;
}
if(!*fr){
return0;
}
cp++;
}
return1;
}
Si ves algo que se podría mejorar de ahí, por favor, dimelo. Gracias.
« Última modificación: 21 Mayo 2016, 14:06 pm por mester »
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...