Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SheKeL_C$ en 18 Marzo 2016, 14:11 pm



Título: Problema con realloc en un bucle
Publicado por: SheKeL_C$ en 18 Marzo 2016, 14:11 pm
Estoy aprendiendo c y me encuentro con algo que no se como resolver..

Usando olly encuentro que el problema de este codigo me lo da con el 'realloc', en la primera vuelta del bucle funciona bien, pero en la segunda se va todo al garete

Estoy usando bien el realloc??

Código:
struct st_files {
    char filename[80];      // se supone que el nombre de un archivo no superan los 80 caracteres... es un test
    unsigned long filesize;
};

int getFilesDirectoryTest(st_files **files, const char *path) {
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE;
 
    hFind = FindFirstFile(LPCSTR(path), &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE) {
        // Error...
        return -1;
    } else {
        int aux = 0;            // Numero de archivos en el directorio
        *files = (st_files*) calloc(1,sizeof(st_files));

        do {
            if (strcmp(FindFileData.cFileName, ".")  != 0 &&
               strcmp(FindFileData.cFileName, "..") != 0 ){
                st_files *sTemp = (st_files*) realloc( * files, (aux+1) * sizeof( struct st_files));
                if (sTemp == NULL) return -1;
                *files = sTemp;  

                strcpy(files[aux]->filename, FindFileData.cFileName);
                files[aux]->filesize = 2; // por poner un ejemplo....
                aux++;
            }
        } while(FindNextFile(hFind, &FindFileData) != 0);

        FindClose(hFind);

        return aux;
    }
}

int main() {
    const char *path = "C:\\test\\*";

    st_files *files1;
    int total = getFilesDirectoryTest(&files1, path);
    for (int i = 0; i<total; i++) {
        debug_(files1[i].filesize);
        debug_(files1[i].filename);
    }
}


Título: Re: Problema con realloc en un bucle
Publicado por: MAFUS en 18 Marzo 2016, 14:21 pm
¿Qué error te dice el compilador que hay?

Por cierto, tienes pérdida de memoria en la linea
Código
  1. *files = sTemp;
*files apunta a una zona a la que has adquirido memoria con calloc pero no la liberas antes de la nueva asignación.

Para solucionar eso, y saltarte un paso en ello, haz realloc sobre *files mismo; realloc se encargará de liberar la memoria y ocupar otra para *files, que para eso es su trabajo.


Título: Re: Problema con realloc en un bucle
Publicado por: SheKeL_C$ en 18 Marzo 2016, 16:49 pm
Es que el error que me da es en tiempo de ejecucion.

Si solo lista un archivo lo hace correctamente, en cuanto son dos o mas es donde me da el error.

Haciendo debug con el olly veo que cuando llega al relloc en la segunda iteraccion el EAX me devuelve un valor que no apunta a un espacio existente


Título: Re: Problema con realloc en un bucle
Publicado por: Arkangel_0x7C5 en 18 Marzo 2016, 17:48 pm
esto esta mal

Código
  1. files[aux]->filesize = 2; // por poner un ejemplo....
deberia ser asi
Código
  1. ((*files)+aux)->filesize = 2; // por poner un ejemplo....

Estabas produciendo un desbordamiento de la pila

Saludos ark


Título: Re: Problema con realloc en un bucle
Publicado por: SheKeL_C$ en 18 Marzo 2016, 18:04 pm
esto esta mal

Código
  1. files[aux]->filesize = 2; // por poner un ejemplo....
deberia ser asi
Código
  1. ((*files)+aux)->filesize = 2; // por poner un ejemplo....

Estabas produciendo un desbordamiento de la pila

Saludos ark

 :D :D :D Gracias.. ese era el problema