Initiale allocation de mémoire
Bonsoir à toutes et à tous,
Me voici une fois de plus confronté à un problème dont j'ignore encore la raison. Tout d'abord, le code simplifié:
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
|
typedef struct
{
float x;
float y;
float z;
} coordinates;
unsigned short coord_size = sizeof(coordinates);
char PDBFileName[250];
unsigned int maxNbPDBFiles = 60;
unsigned int nbResidues = 59;
unsigned int nbPDBFiles = 0;
coordinates **atomCoords = malloc (maxNbPDBFiles * sizeof(coordinates *));
FILE *PDBListFile, *PDBFile; // PDBListFile contient une liste de fichiers qui seront ouvert grâce à PDBFile
if ((PDBListFile = fopen(argv[PDBListFileNb], "r")) != NULL)
{
fgets(PDBFileName, 250, PDBListFile);
while (!feof(PDBListFile))
{
if (PDBFileName[strlen(PDBFileName)-1] == '\n') PDBFileName[strlen(PDBFileName)-1] = '\0';
if ((PDBFile = fopen(PDBFileName, "rt")) != NULL)
{
if (nbPDBFiles == maxNbPDBFiles)
{
printf ("\n\n\n\n\nREALLOCATION OF atomCoords\n\n\n\n\n");
maxNbPDBFiles += 100;
if ((atomCoords = realloc (atomCoords, maxNbPDBFiles * sizeof(coordinates *))) == NULL) fatal_error("MEMORY", "extend the size of atomCoords variable");
}
printf("\n\nnbPDBFiles = %u\t\tnbResidues = %u (%u)\n", nbPDBFiles, nbResidues, coord_size);
atomCoords[nbPDBFiles] = malloc(nbResidues * coord_size);
fgets(PDBFileLine, 79, PDBFile);
while (!feof(PDBFile))
{
/* Là, nous lisons le fichier PDBFileName.
Ce dernier contient 59 lignes (d'où la valeur de la variable nbResidues),
chacune des lignes contenant 3 valeurs (float): x, y et z.
Chacune de ces valeurs est enregistrée dans la variable atomCoords[nbPDBFiles].*/
[...]
fgets(PDBFileLine, 79, PDBFile);
}
fclose(PDBFile);
}
fgets(PDBFileName, 250, PDBListFile);
}
} |
Maintenant, le problème que j'ai découvert en utilisant Valgrind.
Quand j'utilise pour la variable maxNbPDBFiles une valeur d'initialisation strictement inférieure à 60, aucun problème n'est rencontré. J'ai les lignes suivantes qui s'affiche:
Citation:
nbPDBFiles = 1 nbResidues = 59 (12)
nbPDBFiles = 2 nbResidues = 59 (12)
nbPDBFiles = 3 nbResidues = 59 (12)
nbPDBFiles = 4 nbResidues = 59 (12)
[Je passe là le superflu...]
nbPDBFiles = 57 nbResidues = 59 (12)
nbPDBFiles = 58 nbResidues = 59 (12)
nbPDBFiles = 59 nbResidues = 59 (12)
nbPDBFiles = 60 nbResidues = 59 (12)
nbPDBFiles = 61 nbResidues = 59 (12)
nbPDBFiles = 62 nbResidues = 59 (12)
[Le reste se déroule de la même façon, sans souci...]
Maintenant, si j'utilise une valeur d'initialisation d'au moins 60, et ce, SANS NE RIEN TOUCHER D'AUTRE AU PROGRAMME, Valgrind me sort:
Citation:
nbPDBFiles = 1 nbResidues = 59 (12)
nbPDBFiles = 2 nbResidues = 59 (12)
nbPDBFiles = 3 nbResidues = 59 (12)
[Je passe là le superflu...]
nbPDBFiles = 57 nbResidues = 59 (12)
nbPDBFiles = 58 nbResidues = 59 (12)
nbPDBFiles = 59 nbResidues = 59 (12)
==6323== Invalid write of size 4
==6323== at 0x8048EB6: main (contact_map.c:101)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x8049060: main (contact_map.c:140)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x8049091: main (contact_map.c:142)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
==6323==
==6323== Invalid read of size 4
==6323== at 0x80490C3: main (contact_map.c:144)
==6323== Address 0x40282D4 is 0 bytes after a block of size 236 alloc'd
==6323== at 0x4005622: realloc (vg_replace_malloc.c:306)
==6323== by 0x80496A0: main (contact_map.c:202)
--6323-- REDIR: 0xC81400 (mempcpy) redirected to 0x4006B70 (mempcpy)
nbPDBFiles = 60 nbResidues = 59 (12)
nbPDBFiles = 61 nbResidues = 59 (12)
nbPDBFiles = 62 nbResidues = 59 (12)
Le pire, c'est que, dans ce cas, ça aboutit à une erreur de segmentation lors de la lecture de ma variable atomCoords tout à la fin de mon programme, une fois que toutes les valeurs ont été enregistrées!
Si quelqu'un a la moindre idée de ce qui se passe là, je suis preneur.
Merci par avance,
Mickaël