Problema con realloc en un bucle

Iniciado por SheKeL_C$, 18 Marzo 2016, 14:11 PM

0 Miembros y 1 Visitante están viendo este tema.

SheKeL_C$

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??

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);
   }
}

MAFUS

¿Qué error te dice el compilador que hay?

Por cierto, tienes pérdida de memoria en la linea *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.

SheKeL_C$

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

Arkangel_0x7C5

esto esta mal

Código (c++) [Seleccionar]

files[aux]->filesize = 2; // por poner un ejemplo....

deberia ser asi
Código (c++) [Seleccionar]

((*files)+aux)->filesize = 2; // por poner un ejemplo....


Estabas produciendo un desbordamiento de la pila

Saludos ark

SheKeL_C$

Cita de: Arkangel_0x7C5 en 18 Marzo 2016, 17:48 PM
esto esta mal

Código (c++) [Seleccionar]

files[aux]->filesize = 2; // por poner un ejemplo....

deberia ser asi
Código (c++) [Seleccionar]

((*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