[C con Clase] problema con punteros

zelion zelion_cracking en yahoo.es
Sab Nov 3 11:51:25 CET 2007


El pasado 2007-11-01 13:50:21, Ariel escribió:
 
A> Hola a todos:
A> Tengo un problema que llevo tiempo por resolverlo, tiene que ver con la 
A> memoria.
A> Estoy trabajando con eclipse sobre windows usando cywin, estoy haciendo 
A> un ejercicio de la escuela que es un programa en ansi C que analiza 
A> textos y saca los terminos del texto por cada fichero y debe encontrar 
A> por cada fichero la todas las secuencias de palabras de dos, pero el 
A> problema es que estoy analizando una base de datos de 200 textos cada 
A> uno como promedio tiene 200 palabras es decir tengo 200*200 =40 000 
A> palabras en total, cuando analizo este texto con mi programa para 
A> encontrar los terminos de cada fichero y por cada fichero encontrar 
A> todas las secuencias pares: por ejemplo en un texto que diga "brasil va 
A> a la copa" las secuencias pares serian "brasil va" "va a" "a la" "la 
A> copa" cuando corro el programa que me hace esto me da un 
A> error:"2208_cygtls::handle_exceptions: Exception: =
A> STATUS_ACCESS_VIOLATION" he tenido cuidado en liberar cada memoria que 
A> reservo pero no sé que ocurre, todo lo almaceno en memoria tengo una 
A> lista enlazada para los ficheros que cada elemento tiene una estructura
A> con el nombre del fichero, los terminos de ese fichero en una lista 
A> enlazada y sus pares de palabras tambien en una lista enlazada.
A> Si algunos de ustedes me puede ayudar y darme un norte de lo que puede 
A> estar ocurriendo se lo agradecería.
A> Aqui les pongo algunas de las funciones:
A> /*Devuelve un puntero a la lista enlazada con los terminos de
A>     *una cadena separados por cualquiera de los caracteres invalidos:
A>     *espacio,nueva linea,retorno ...
A>     */
A>     Element* getOrderedTermsFromStringCad(char* stringCad){
A>         int cantChar = strlen(stringCad);
A>         int i;
A>         char* word = (char*) malloc(sizeof(char*));
A>         word[0]=0;
A>         char str2[2];
A>         str2[1] = '\0';
A>         Element *head = NULL;
A>        
A>         int offset = 0;
A>         for (i = 0; i < cantChar; ++i) {
A>             if (isCharacterValid(stringCad[i])!=0){
A>                 str2[0]= stringCad[i];               
A>                 word = realloc(word, sizeof(char*)*(i-offset +1));
A>                 strcat(word, str2);
A>                 }
A>             else {
A>                 offset = i;
A>                 if ((strlen(word)>0)){
A>                    
A>                     if (isStopWord(word)==0){
A>                         head = addElement(head,strdup(word));
A>                         }
A>                     word = (char*)calloc(1,sizeof(char));
A>                     word[0]='\0';//Hay que inicializarlo para concatenar 
A> bien
A>                     }
A>                 }
A>             }
A>         if (strlen(word)!=0){
A>             if (isStopWord(word)==0){
A>                 head = addElement(head,strdup(word));
A>                 }
A>             }
A>         //free(word);
A>         return head;
A>         }

Hola de nuevo Ariel.
Todo el mundo a tenido su primer dia con 'c' no te desanimes.

Al tema.
en esta linea:
char* word = (char*) malloc(sizeof(char*));

asignas 4 bytes de memoria para solo 1 letra, supongo que querras poner
char* word = (char*) malloc(sizeof(char));

Con lo que reservas para solo 1 caracter, por que luego en 
word = realloc(word, sizeof(char*)*(i-offset +1));

Asignas a cada letra 4 bytes mas, con lo que se derrocha memoria una palabra como murcielago tendra 40 bytes ya que 10*4 =40.
igual querras poner 
word = realloc(word, sizeof(char)*(i-offset +1));

con lo que ahora contendra 10 bytes murcielago, que es el tamaño de la palabra.

De todas formas, esto no te asegura que te quite la excepcion, esta excepcion parece ser un acceso a memoria no valido, con lo que mira haber si puedes depurar hasta el punto en el que te salta la excepcion para tener una idea mas exacta de donde ocurre el problema.

un saludo.


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