elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con realloc en un bucle
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con realloc en un bucle  (Leído 2,216 veces)
SheKeL_C$


Desconectado Desconectado

Mensajes: 549


_-=[Sh3K3L_C$]=-_


Ver Perfil
Problema con realloc en un bucle
« 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);
    }
}


« Última modificación: 18 Marzo 2016, 16:50 pm por SheKeL_C$ » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema con realloc en un bucle
« Respuesta #1 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.


En línea

SheKeL_C$


Desconectado Desconectado

Mensajes: 549


_-=[Sh3K3L_C$]=-_


Ver Perfil
Re: Problema con realloc en un bucle
« Respuesta #2 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
En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: Problema con realloc en un bucle
« Respuesta #3 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
En línea

SheKeL_C$


Desconectado Desconectado

Mensajes: 549


_-=[Sh3K3L_C$]=-_


Ver Perfil
Re: Problema con realloc en un bucle
« Respuesta #4 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con bucle While en vb 6.0
Programación Visual Basic
merlin 2 2,513 Último mensaje 14 Abril 2007, 02:39 am
por Sancho.Mazorka
Problema con bucle
Programación Visual Basic
mdg 0 1,217 Último mensaje 20 Noviembre 2007, 22:02 pm
por mdg
Duda (Parar bucle con dato boolean) [bucle while]
Java
Dem0ny 5 18,237 Último mensaje 17 Diciembre 2008, 17:43 pm
por Dem0ny
Problema con realloc - c
Programación C/C++
HRSLASH 5 2,905 Último mensaje 5 Noviembre 2012, 02:51 am
por HRSLASH
Problema con realloc :(
Programación C/C++
sherry_XD 4 2,267 Último mensaje 4 Julio 2014, 17:38 pm
por do-while
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines