[C con Clase] Manejo de memoria en C

Programante programante en gmail.com
Mie Nov 28 22:30:20 CET 2007


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] = '|';




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