2017-02-15 68 views
0

有人可以解释为什么下面的代码在第二个printf上产生不同的结果,如果我评论第一个printf行或不在64位64位ELF产生无法解释的结果

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

我得到的第二个printf结果如下:

  • 评论:0
  • 注释掉:61

提前感谢!

iansus

回答

0

有人可以解释为什么下面的代码产生的第二个printf不同的结果,如果我评论的第一个printf线或不

你的程序使用a[-1],因此展品未定义的行为。 任何东西都可能发生,并找出究竟为什么发生其中一件事是毫无意义

确切的原因是,您正在读取第一个printf(在注释时)写入的内存。

我得到不同的结果(预计与未定义行为):

// with first `printf` commented out: 
ffffffff 

// with it commented in: 
00007fffffffdd20 00007fffffffdd1b 
ffffffff 

你可以看到该内存的写入通过它设置GDB观察点:

(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); 

它我上面的情况下,该值是作为初始化count=-1的一部分编写的。也就是说,使用我的gcc版本,count位于a[0]之前。但是这可能取决于编译器版本,编译器是如何构建的等等。