[linux]segfault lors d'un realloc d'une structure
salut à tous,
je voudrais créer une "base de données" de tous les répertoires contenu dans mon répertoire. Dans ma base, je stocke le nom du répertoire, sa date en caractères, sa taille en caractères et son type en entier (main.h):
Code:
1 2 3 4 5 6 7 8
|
typedef struct
{
char filename[256];
char filesize[7];
char filedate[16];
int filetype;
} struct_file_type; |
Maintenant, je vais lister un à un les répertoireset réallouer la mémoire à chaque fois qu'un nouveau fichier est créer. J'initialise de cette manière :
Code:
1 2 3 4 5 6
|
struct_file_type *file_type, *new_file_type;
int nb_elements;
nb_elements=0;
file_type=malloc(sizeof(*file_type)); |
Noté que pour l'instant, il n'y a rien dedans.
Maintenant je liste et teste si c'est un répertoire. Si oui je fais :
Code:
1 2 3 4 5 6 7 8 9
|
// c'est un repertoire
nb_elements++;
print_message_and_wait("Here");
if ((new_file_type=realloc(file_type,nb_elements*sizeof(*new_file_type))) == NULL) {
print_message_and_wait("ERREUR");
}
print_message_and_wait("OK");
file_type=new_file_type; |
Alors la réallocation de la mémoire marche pour le premier dossier .. mais pas pour le second. J'ai bien le message Here qui s'affiche mais j'ai directement derrière un segfault, même pas le message ERREUR....
Alors plusieurs idées me viennent à l'esprit :
1) Dois-je désallouer file_type avant de faire file_type=new_file_type ?
2) Dois-je faire une copie de mémoire après la réallocation, avant le file_type=new_file_type ??? (Je suppose que oui mais je voudrais qu'on me confirme).
3) Dernier problème : D'où vient mon segfault ??? :?
Merci d'avance :)
Re: [linux]segfault lors d'un realloc d'une structure
Citation:
Envoyé par le mage tophinus
je voudrais créer une "base de données" de tous les répertoires contenu dans mon répertoire. Dans ma base, je stocke le nom du répertoire, sa date en caractères, sa taille en caractères et son type en entier (main.h):
<...>
Alors la réallocation de la mémoire marche pour le premier dossier .. mais pas pour le second. J'ai bien le message Here qui s'affiche mais j'ai directement derrière un segfault, même pas le message ERREUR....
Ca me parait un peu tordu comme code.. Je ferais comme ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct
{
char filename[256];
char filesize[7];
char filedate[16];
int filetype;
}
file_info_s;
static void print_message_and_wait (char const *s)
{
printf ("%s\n", s);
system ("pause");
}
int main (void)
{
int nb_elements;
file_info_s *file_info = NULL;
for (nb_elements = 1; nb_elements <= 5; nb_elements++)
{
void *tmp = realloc (file_info, nb_elements * sizeof (*file_info));
if (tmp == NULL)
{
print_message_and_wait ("ERREUR");
free (file_info), file_info = NULL;
break;
}
else
{
file_info = tmp;
print_message_and_wait ("OK");
}
}
/* quand c'est fini ... */
free (file_info), file_info = NULL;
assert (file_info == NULL);
return 0;
} |
Dis nous si les erreurs persistent avec ça...