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.
A voir également:

4 réponses

fiddy Messages postés 11653 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
dallap
 
merci beaucoup Fiddy ça venait en effet de la boucle for qui dépassait du tableau.

bonne journée ! ;)
0
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
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
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
dallap
 
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 11653 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
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
dallap
 
ça plante toujours après la 1ère entrée de x[1] avec les modif que tu m'a dis
0
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