Bonsoir à toutes et à tous,

Je n'ai encore jamais rencontré un tel problème dans toute ma courte vie de programmation en C. Mais là, après des recherches qui n'en terminent plus, j'ai décidé de me tourner vers... les professionnels!

Voici donc le problème qui me fait face depuis maintenant un certain temps. J'ai une fonction appelée depuis le programme central, dans laquelle un appel à malloc ne faillit (Segmentation fault) QUE dans certaines conditions. Voici le bout de code crucial:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
nwnz = numWtNonZero(argWt,prepareConf.conformerNum);
printf("Found %ld non-zero weights\n",nwnz);
nwnzW = (double *)malloc((nwnz+1)*sizeof(double));
En fait, j'avais au début constaté que ce code ne fonctionnait que pour certaines valeurs de nznw (qui dépend des arguments passés).
Bref, j'ai donc légèrement modifié le code pour voir quelles sont les valeurs qui passent, et celles qui ne passent pas. Voici le nouveau code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
nwnz=numWtNonZero(argWt,prepareConf.conformerNum);
printf("Found %ld non-zero weights\n",nwnz);
nwnzW=(double *)malloc(18*sizeof(double));
Manuellement, j'ai changé la valeur de (nwnz+1). Dans l'exemple ci-dessus, j'ai mis 18. Bien entendu, j'ai testé beaucoup de valeurs comme ça et il s'est avéré que pour TOUTE VALEUR COMPRISE ENTRE 5 ET 26 (inclus), ça plante. Par contre, si je mets une valeur de 1 à 4, ou supérieure à 26, tout marche pour le mieux.

J'ai été encore plus loin. En fait, j'ai modifié une fois de plus le code de la façon suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
nwnz=numWtNonZero(argWt,prepareConf.conformerNum);
printf("Found %ld non-zero weights\n",nwnz);

int j;
for (j=0; j<100; j++)
{
	printf ("J = %d\n", j);
	nwnzW = (double *)malloc(18*sizeof(double));
}

Dans ce code, j'ai aussi modifié manuellement la valeur du 18 que vous voyez, exactement de la même façon qu'avant. Les résultats sont pour moi pour le moins curieux...
Si je mets une valeur de
1 ==> Ca plante quand J = 4
2 ==> Ca plante quand J = 3
3 ==> Ca plante quand J = 2
4 ==> Ca plante quand J = 2 (C'est bien 2 là...)
5 ==> Ca plante quand J = 1 (Donc, dès la première tentative)
6-26 ==> Ca plante quand J = 1
>26 ==> Ca ne plante JAMAIS!

Bref, quelqu'un aurait-il une quelconque idée de ce qui peut bien se tramer ici ?

Par avance merci à toute réponse constructive,
Mickaël