2017-02-15 4 views
0

Quelqu'un peut-il expliquer pourquoi le code suivant donne des résultats différents sur le second printf si je commente la première ligne printf ou pas, en 64 bits?ELF 64 bits donnant des résultats inexplicables

/* 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; 
} 

-je obtenir les résultats suivants pour le deuxième printf:

  • a commenté: 0
  • décommentée: 61

Merci à l'avance!

iansus

Répondre

0

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.