有人可以解释为什么下面的代码会在第二个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的以下结果:
提前致谢!
iansus
答案 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]
之前。但这可能取决于编译器版本,这个编译器的确切构建方式等等。