2017-02-15 9 views
0

Kann jemand erklären, warum der folgende Code beim zweiten Druck unterschiedliche Ergebnisse liefert, wenn ich die erste Druckzeile kommentiere oder nicht, in 64 Bits?64-Bit-ELF mit unerklärlichen Ergebnissen

/* gcc -O0 -o test test.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    char a[20] = {0}; 
    char b = 'a'; 
    int count=-1; 


    // printf("%.16llx %.16llx\n", a, &b); 
    printf("%x\n", *(a+count)); 

return 0; 
} 

Ich erhalte die folgenden Ergebnisse für das zweite printf:

  • kommentiert: 0
  • unkommentiert: 61

Vielen Dank im Voraus!

iansus

Antwort

0

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.

Verwandte Themen