(Débutant) Bug ou Erreur de ma part
Résolu
igeek96
Messages postés
143
Date d'inscription
Statut
Membre
Dernière intervention
-
igeek96 Messages postés 143 Date d'inscription Statut Membre Dernière intervention -
igeek96 Messages postés 143 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je débute en programmation en C et j'ai fait un petit "programme" pour m'entrainer et il se trouve qu'il y a quelque chose d'inéxplicable… Voyez :
Dans ce code donc, quand j'enlève le bout de code en gras, ca ne marche pas et la fonction printf renvoie -1073742802 (une adresse je pense), mais quand je le met, le code marche parfaitement.
Est ce que quelqu'un pourrait m'éclairer sur le sujet? Meerci!
Je débute en programmation en C et j'ai fait un petit "programme" pour m'entrainer et il se trouve qu'il y a quelque chose d'inéxplicable… Voyez :
#include <stdio.h> #include <stdlib.h> long sommeTableau(long tableau[], long tailleTableau); int main(int argc, char *argv[]) { long factures[3] = {10 , 20 , 0}; long somme = 0, a = 0; somme = sommeTableau(factures, 3); printf("\n\n%ld\n\n", somme); return 0; } long sommeTableau(long tableau[], long tailleTableau) { long somme = 0, i = 0; for (i = 0 ; i <= tailleTableau ; i++) { somme = somme + tableau[i]; } return somme; }
Dans ce code donc, quand j'enlève le bout de code en gras, ca ne marche pas et la fonction printf renvoie -1073742802 (une adresse je pense), mais quand je le met, le code marche parfaitement.
Est ce que quelqu'un pourrait m'éclairer sur le sujet? Meerci!
A voir également:
- (Débutant) Bug ou Erreur de ma part
- Bug chromecast - Guide
- Bug localisation snap ✓ - Forum Snapchat
- Iptv erreur de lecture - Forum TV & Vidéo
- Iptv bug forum ✓ - Forum Box et Streaming vidéo
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
2 réponses
Salut,
Si tu fais
i <= tailleTableau
tu fais un dépassement de tableau car tu vas de 0 à 3 inclu (ça fait quatre passages)
Il faudrait que tu fasses:
Pour explications:
Il y a effectivement une raison qui ferait que si tu enlèves a=0 de ton code, le bug devient visible.
C'est au moment de la création des variables locales dans la pile, a est alloué à la suite du tableau (il y a des chances que somme ne soit pas alloué dans la pile par contre mais juste dans un registre du processeur).
Bref en gros a est alloué juste à la suite de ton tableau. Ce qui fait que si tu débordes d'un cran de ton tableau, tu tombes sur la valeur de a qui est zero. C'est à dire que si tu fais facture[3] tu tombes finalement sur la valeur de a. Et donc l'addition supplémentaire n'a pas d'effet. Si tu ne mets pas a, tu tombe sur une valeur qui peut être une instruction ou n'importe quoi...donc tu fais une addition ahurissante.
Si tu fais
i <= tailleTableau
tu fais un dépassement de tableau car tu vas de 0 à 3 inclu (ça fait quatre passages)
Il faudrait que tu fasses:
i < tailleTableau
Pour explications:
Il y a effectivement une raison qui ferait que si tu enlèves a=0 de ton code, le bug devient visible.
C'est au moment de la création des variables locales dans la pile, a est alloué à la suite du tableau (il y a des chances que somme ne soit pas alloué dans la pile par contre mais juste dans un registre du processeur).
Bref en gros a est alloué juste à la suite de ton tableau. Ce qui fait que si tu débordes d'un cran de ton tableau, tu tombes sur la valeur de a qui est zero. C'est à dire que si tu fais facture[3] tu tombes finalement sur la valeur de a. Et donc l'addition supplémentaire n'a pas d'effet. Si tu ne mets pas a, tu tombe sur une valeur qui peut être une instruction ou n'importe quoi...donc tu fais une addition ahurissante.