Débordement mémoire

Résolu
dx3d Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   -  
dx3d Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, lors de ma révision pour mes partiels qui approche j'ai rencontré quelques difficultés par ci et la, maintenant j'aimerais savoir si je me goure pas trop dans se que je fais.

En jetant un oeil aux examens des années passé je suis tombé sur quelques questions concernant le débordement en mémoire où il fallait décrire et corriger les débordement mémoire possible sur certains codes.

Code 1 :
int computeAverage(float * t, int n) {
int i = 0;
float sum = 0.0;
for (i=0; i<=n; i++) {
sum = sum+t[i];
}
return sum/n;
}


Code 2 :
int findMin(int t[], int n) {
int i;
int min;
min = t[0];
while (i<n) {
if (t[i]<min) {
min = t[i];
} i
=
i+1;
}
return min;
}


Dans les deux cas ici je vois que si on met un n > taille(tableau) on va lire au dessus de la mémoire allouer au tableau et on va avoir des résultats corrompus. Donc il faudrait limiter n à la taille du tableau, est ce bien cela ?

1 réponse

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Note :
Déjà, le Code1 est faux. Il faut retourner sum/(n+1); puisque tu fais une boucle for de 0 à n compris.

Dans le code2, il manque un i=0; quelque part...

Sinon pour répondre à ta question, dans le premier cas, il faut un tableau de taille n+1 au minimum (puisque tu accèdes à la case t[n]).

Pour l'autre, il suffit que ton tableau soit de taille n.

Cdlt,
1
dx3d Messages postés 68 Date d'inscription   Statut Membre Dernière intervention  
 
Merci bien pour le coup de main Fiddy ! :)
Bonne soirée !
0
dx3d Messages postés 68 Date d'inscription   Statut Membre Dernière intervention  
 
Oui donc j'ai encore un problème du coup, j'ai beau cherché mais pour faire une condition qui oblige à avoir un tableau n+1 il faudrait connaitre la taille du tableau, mais quand je fais passé un tableau en fonction je n'ai pas moyen de connaître sa taille ... Quelqu'un aurait une idée sur comment s'y prendre ? Je peux pas faire de sizeof vu que sa me donne que la taille du pointeur !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Tu te mélanges les pinceaux...
Avant de créer ton tableau, il faut indiquer sa taille. Tu as donc la taille à ce moment là. Et c'est cette taille que tu envoies en argument de tes fonctions.
Par exemple :
int tab[10];
findMin(tab, sizeof tab / sizeof *tab);

Note : sizeof donne bien la taille du tableau. Attention à ne pas confondre avec les pointeurs...

Si tu ne connais pas la taille avant le lancement du programme, alors on créé généralement un pointeur et on alloue sa taille lors de l'exécution. Encore une fois c'est cette taille que tu enverras en argument de ta fonction.
Exemple :
int *tab;
int taille=10;
tab=malloc(taille*sizeof(int));
findMin(tab, taille);
free(tab), tab=NULL;
0
dx3d Messages postés 68 Date d'inscription   Statut Membre Dernière intervention   > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Apparemment comme tu l'as dis j'avais mal imaginé comment cela devait fonctionner, merci encore fiddy de m'avoir éclairer ! :p
0