La sortie du programme change avec l’instruction printf ()

Ci-dessous se trouve un programme C pour trouver le point d’équilibre dans le tableau donné.

#include  void equilibrium(int a[], int n) { int i; int rsum[n], lsum[n]; lsum[0] = a[0]; rsum[0] = a[n-1]; for (i = 1 ; i < n ; i++) { lsum[i] = lsum[i-1]+a[i]; } printf("lsum array: "); for (i = 0 ; i = 0 ; i--) { rsum[i] = rsum[i + 1] + a[i]; } for (i = 0 ; i < n ; i++) { printf("%d ", rsum[i]); } printf("\n\n"); for (i = 1 ; i < n ; i++) { if (lsum[i] == rsum[i]) printf("\n\n%d is equilibrium point", i); } } int main() { int a[8] = {-1,3,-4,5,1,-6,2,1}; //printf("\n\n"); equilibrium(a,8); return 0; } 

Ce code sort comme ci-dessous ce qui est correct:

 lsum array: -1 2 -2 3 4 -2 0 1 rsum array: 1 2 -1 3 -2 -3 3 1 1 is equilibrium point 3 is equilibrium point 7 is equilibrium point 

Le problème se produit lorsque je décomment le

 printf("\n\n"); 

dans la fonction main() .

Maintenant, la sortie change comme suit:

 lsum array: -1 2 -2 3 4 -2 0 1 rsum array: -45602127 -45602126 -45602129 -45602125 -45602130 -45602131 -4560212 5 -45602127 

Si j’inclus une autre variable int, dites ” int value = 1 ” avant de déclarer le tableau ” int a[8] “, la sortie devient:

 lsum array: -1 2 -2 3 4 -2 0 1 rsum array: 3 4 1 5 0 -1 5 3 

Est-ce quelque chose à voir avec la mémoire?

Quelqu’un peut-il s’il vous plaît donner une raison valable pour expliquer pourquoi cela se produit?

Comme l’utilisateur @ xing l’a souligné dans ce commentaire , votre code accède au tableau au-delà des limites. Parce que dans la première itération de la boucle correspondante, la ligne

 rsum[i + 1] + a[i] 

accède à rsum en n , et c’est 1 position après la fin du rsum . Cela provoquera un comportement indéfini connu.

L’effet de l’ajout ou de la suppression de printf() modifie simplement la disposition de la mémoire du programme résultant, comme cela se produit lorsque vous définissez une autre variable. En fait, toute modification de la structure de la mémoire du programme affecte son comportement, donc le mot indéfini .

Dans cette boucle

 for (i = n - 1 ; i >= 0 ; i--) { rsum[i] = rsum[i+1]+a[i]; ^^^^^^^^ 

il y a une mémoire d’access au-delà des limites du tableau. Ainsi, le résultat dépend de ce qui est stocké dans la mémoire après la masortingce.