Prog qui plante a la fin a cause du free (C)

Fermé
dallap - 21 nov. 2009 à 19:28
 dallap - 22 nov. 2009 à 18:57
Bonjour,
J'ai un programme en C.
Je fais de la place dans la mémoire grâce à malloc:

x = (float *) malloc(n*sizeof(int));     // We reserve a area in the memory for x
    y = (float *) malloc(n*sizeof(int));  // We reserve a area in the memory for y


puis je met ensuite des entiers dans les tableaux x et y:

 printf ("Please choose the value of x[%d] :\n", i) ;         // We ask the user for the value of x for each pair
            scanf ("%f", &x[i]) ;         
            printf ("Please choose the value of y[%d] :\n",i) ;   // We ask the user for the value of y for each pair
            scanf ("%f", &y[i]) ; 


et à la fin du programme je libère la place avec free:

         free (x);
        free (y);


Lorsque je ne met pas les free, le programme fonctionne correctement. Mais lorsque je les rajoute à la fin du programme il plante et je ne comprend pas pourquoi.

Auriez vous une idée?

merci.
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
21 nov. 2009 à 23:25
Salut,

x = (float *) malloc(n*sizeof(int));
Attention x est un pointeur sur un float. Il faut donc allouer n*sizeof(float) ou n*sizeof *x

for (i=1;i<=n;i++)
Un tableau commence à l'indice 0 et se termine à n-1. Donc la boucle sera : for(i=0;i<n;i++);
Sinon tu écriras sur une case non allouée dans le heap ou pire encore, cela pourra changer une valeur dans une autre zone allouée contigument.

Si cela ne marche toujours pas, poste ton code global (avec les déclaration de toutes tes variables, les en-têtes, ...).

Sinon quelques conseils :
Evite les variables globales et vérifie la valeur de retour du malloc.

Cdlt
1
merci beaucoup Fiddy ça venait en effet de la boucle for qui dépassait du tableau.

bonne journée ! ;)
0
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 octobre 2011 52
21 nov. 2009 à 19:56
Pour qu'on t'aide faut montrer tout le code concerné,

tu fais de la place pour un tableau int alors que ton tableau est aprament un float
et si c'est un int il ya des erreurs dans la suite du code


0
voici la déclaration:

float *x=NULL;                   // We initialize the pointer x
float *y=NULL;                   // We initialize the pointer y


et le code qui peut vous intéresser:

int main () {                                    // Main function
int i = 0;

    printf ("Please enter N :") ;                // We ask the user to enter the number of x-y pairs he wants to give
    scanf ("%d", &n) ;
    
    x = (float *) malloc(n*sizeof(int));         // We allocate a area in the memory for x
    y = (float *) malloc(n*sizeof(int));         // We allocate a area in the memory for y

    for (i=1;i<=n;i++)                           // Loop of the number of pairs N
        {           
            printf ("Please choose the value of x[%d] :\n", i) ;         // We ask the user for the value of x for each pair
            scanf ("%f", &x[i]) ;         
            printf ("Please choose the value of y[%d] :\n",i) ;   // We ask the user for the value of y for each pair
            scanf ("%f", &y[i]) ; 
        }

D = D_calc(n,x);         // We call the function which calculates D
A = A_calc(n,x,y);       // We call the function which calculates a
B = B_calc(n,x,y);       // We call the function which calculates b
L= - (B/A);              // We calculate L


et par exemple la fonction D_calc:
float D_calc (int n, float *x){                   // Function which calculate the value of D
      int i;
      float D1=0, D2=0, D;
            for (i=1 ; i<=n ; i++){
            D1 = D1 + x[i] * x[i];                // D1 is the first sum of D-equation
            D2 = D2 + x[i];                       // D2 is the second sum of D-equation
            }
        
      D1 = D1 * n;                                // We multiply the first sum of D-equation by n
      D2 = D2 * D2;                               // We put at the power 2 the second part of D-equation
      D = D1 - D2;                                // We finally calculate D
      return (D);
}    



merci :)
0
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 octobre 2011 52
21 nov. 2009 à 20:26
Quand tu fais
scanf ("%f", &x[i]) ; 
tu écrase le pointeur sur l'adresse et quqnd tu fais apelle à free argumenté par x ça fais planter, donc fais
scanf ("%f", x[i]) ; 
et
printf ("%f", *x[i]) ; 
pour utiliser ton tableu
0
quand je met
 scanf ("%f", x[i]) ; 

il plante directement après la première entrée de x[0] :(
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
21 nov. 2009 à 23:18
tu écrase le pointeur sur l'adresse et quqnd tu fais apelle à free argumenté par x ça fais
Non. &x[i] est correct puisqu'il s'agit de l'adresse de la i+1ème case du tableau. On peut écrire à la place x+i tout simplement.
Donc il faut mettre scanf("%f",&x[i]); et printf("%f",x[i]);
0
Zestyr Messages postés 466 Date d'inscription mercredi 12 août 2009 Statut Membre Dernière intervention 17 octobre 2011 52
21 nov. 2009 à 20:37
A oui aussi,
même si sur ton ordi les float et les int font la même taille change ça:
x = (float *) malloc(n*sizeof(int)); 
           y = (float *) malloc(n*sizeof(int));
en ça
x = (float *) malloc(n*sizeof(float)); 
           y = (float *) malloc(n*sizeof(float));


Car sinon ça veux plus rien dire, autan) demander 2Mo(float *500*1000) xD ou même ne pas faire d'allocation dynamique !
0
ça plante toujours après la 1ère entrée de x[1] avec les modif que tu m'a dis
0
flo > dallap
21 nov. 2009 à 20:50
comment on fait pour apprendre a programmer comme vous svp faut combien de temp pour y arriver et qu est ce qu il faut merci
0