64位ELF产生无法解释的结果

时间:2017-02-15 20:36:47

标签: pointers 64-bit elf

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

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

1 个答案:

答案 0 :(得分: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]之前。但这可能取决于编译器版本,这个编译器的确切构建方式等等。