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

dallap -  
 dallap -
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.

4 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. dallap
       
      merci beaucoup Fiddy ça venait en effet de la boucle for qui dépassait du tableau.

      bonne journée ! ;)
      0
  2. Zestyr Messages postés 503 Statut Membre 52
     
    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
    1. dallap
       
      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
  3. Zestyr Messages postés 503 Statut Membre 52
     
    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
    1. dallap
       
      quand je met
       scanf ("%f", x[i]) ; 

      il plante directement après la première entrée de x[0] :(
      0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  4. Zestyr Messages postés 503 Statut Membre 52
     
    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
    1. dallap
       
      ça plante toujours après la 1ère entrée de x[1] avec les modif que tu m'a dis
      0
      1. flo > dallap
         
        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