Kann jemand erklären, warum der folgende Code unterschiedliche Ergebnisse auf dem zweiten printf ergibt, wenn ich die erste printf Linie Kommentar oder nicht
Ihr Programm verwendet a[-1]
und damit Exponate undefiniertes Verhalten. Anything kann passieren, und genau herauszufinden, warum die eine oder andere Sache passiert ist sinnlos.
Der genaue Grund ist, dass Sie Speicher lesen, der von der ersten printf
(wenn kommentiert) geschrieben wird.
ich ein anderes Ergebnis (die mit undefinierten Verhalten erwartet wird):
// with first `printf` commented out:
ffffffff
// with it commented in:
00007fffffffdd20 00007fffffffdd1b
ffffffff
Sie können sehen, wo das Gedächtnis durch das Setzen eines GDB Beobachtungspunkt auf der es geschrieben ist:
(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);
Es In meinem obigen Fall wird der Wert als Teil der Initialisierung count=-1
geschrieben. Das heißt, mit meiner Version von gcc, count
befindet sich kurz vor a[0]
. Dies hängt jedoch von der Compiler-Version ab, davon, wie dieser Compiler erstellt wurde, usw.