Quelqu'un peut-il expliquer pourquoi le code suivant donne des résultats différents sur le deuxième printf si je commente la première ligne printf ou non
Votre programme utilise a[-1]
, et présente ainsi comportement indéfini. Tout peut peut arriver, et comprendre exactement pourquoi l'une ou l'autre chose se produit est inutile.
La raison précise est que vous lisez de la mémoire qui est écrite par le premier printf
(lorsque vous y êtes invité).
-je obtenir un autre résultat (qui est attendu avec un comportement non défini):
// with first `printf` commented out:
ffffffff
// with it commented in:
00007fffffffdd20 00007fffffffdd1b
ffffffff
Vous pouvez voir où cette mémoire est écrite en définissant un point d'observation GDB sur elle:
(gdb) p a[-1]
$1 = 0 '\000'
(gdb) p &a[-1]
$2 = 0x7fffffffdd1f ""
(gdb) watch *(int*)0x7fffffffdd1f
Hardware watchpoint 4: *(int*)0x7fffffffdd1f
(gdb) c
Continuing.
Hardware watchpoint 4: *(int*)0x7fffffffdd1f
Old value = 0
New value = 255
main() at t.c:12
12 printf("%.16llx %.16llx\n", a, &b);
Il mon cas ci-dessus, la valeur est écrite dans le cadre de l'initialisation count=-1
. Autrement dit, avec ma version de gcc, count
est situé juste avant a[0]
. Mais cela peut dépendre de la version du compilateur, exactement comment ce compilateur a été construit, etc.