[C con Clase] Manejo de memoria en C

Adrian Ferreres Esteller raro82 en hotmail.com
Jue Nov 29 09:27:47 CET 2007




> Date: Wed, 28 Nov 2007 22:30:20 +0100
> To: cconclase en listas.conclase.net
> From: programante en gmail.com
> Subject: Re: [C con Clase] Manejo de memoria en C
> 
> Adrian Ferreres Esteller escribió:
> > Hola lista:
> >
> >   Tengo un problema sobre manejo de mapeados de memoria en C. Tengo 
> > mapeado un fichero en memoria. Ese fichero tiene la forma de:
> >
> > Etiqueta Valor1#Valor2#Valor3
> >
> > y tengo que cambiar los separadores # por los separadores |. Tengo un 
> > puntero a void llamado pAux1 que me apunta a la direccion de memoria 
> > inicial y el codigo que uso es el siguiente
> >
> > While ((pAux1 = memchr(pAux1,'#',LONG_LINEA) != NULL)
> >         memset (pAux1,'|',sizeof(char));
> >
> >
> >
> > El resultado de ejectuar esta sentencia es segmentation fault y me da 
> > al ejecutar el memset. Es decir, logueo el valor de pAux1 antes del 
> > bucle y antes del memset y se que es correcto y que esta apuntando a 
> > la # pero al ejecutar el memset casca. ¿Alguien sabe porque?
> >
> >
> > Muchas Gracias por vuestro tiempo
> >
> > P.D: Por si alguien lo dudaba, LONG_LINEA es una constante que vale la 
> > longitud maxima de una linea del fichero mapeado en memoria
> Es la longitud máxima de la línea, vale, pero ¿hay al menos LONG_LINEA 
> caracteres desde el último # hasta el final del archivo? En otro caso 
> intentará comprobar si hay algún # después de finalizar la zona en que 
> el archivo está mapeado, dando el fallo de segmentación (o peor aún: 
> fallando a veces sí y a veces no).
> 
> Seguramente deberías rehacerlo realizando la comprobación sobre el 
> tamaño del archivo:
> for (i=0; i < Tam_Archivo; i++)
>     if (((char*)pAux1)[i] == '#')
>          ((char*)pAux1)[i] = '|';
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

No, tampoco funciona. He copidado el codigo que me dices añadiendo dos log por pantalla:

for (i=0;i<Tam_Archivo;i++) {
    printf ("Iteracion numero: %d",i);
    printf (" Valor de pAux1 antes de la sustitucion: <%s>",pAux1);
    if (((char*)pAux1)[i]=='#')
       ((char*)pAux1[i]='l';
   printf ("Valor de pAux1 despues de la sustitucion: <%s>",pAux1);
}


Tengo un Segmentation Fault justo cuando entra en la condicion, es decir, al acceder a la posicion pAux[i] para cambiar el char '#' por el '|'

_________________________________________________________________
Tecnología, moda, motor, viajes,…suscríbete a nuestros boletines para estar a la última
http://newsletters.msn.com/hm/maintenanceeses.asp?L=ES&C=ES&P=WCMaintenance&Brand=WL&RU=http%3a%2f%2fmail.live.com
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20071129/6445eab3/attachment.html>


Más información sobre la lista de distribución Cconclase