Prog qui plante a la fin a cause du free (C)
dallap
-
dallap -
dallap -
Bonjour,
J'ai un programme en C.
Je fais de la place dans la mémoire grâce à malloc:
puis je met ensuite des entiers dans les tableaux x et y:
et à la fin du programme je libère la place avec free:
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.
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:
- Prog qui plante a la fin a cause du free (C)
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Zimbra free - Guide
- Word 2013 free download - Télécharger - Traitement de texte
- Fin du coaxial sfr - Accueil - Box & Connexion Internet
- Free office - Télécharger - Suite bureautique
4 réponses
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
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
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
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
voici la déclaration:
et le code qui peut vous intéresser:
et par exemple la fonction D_calc:
merci :)
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 :)
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
A oui aussi,
même si sur ton ordi les float et les int font la même taille change ça:
Car sinon ça veux plus rien dire, autan) demander 2Mo(float *500*1000) xD ou même ne pas faire d'allocation dynamique !
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 !
bonne journée ! ;)