gdb内存地址与程序打印出的内存地址不匹配

gdb memory addresses not matching memory address printed out by program

我有一个像这样的基本 C 程序:

#include <stdio.h>
int main()
{
    int cookie;
    char buf[80];

    printf("A: %x B: %x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x11111111){
        printf("You win!\n");
    } else {
        printf("THIS Didn't WORK");
    }
}

当我运行它时,打印语句打印A: efbffab0 B: efbffb08

然而,如果我在 gdb 中打开这个程序并探索任何变量的内存地址,我得到的值比 C 程序打印出的值更长:

Thread 2 hit Breakpoint 1, main () at challenge.c:10
10      if (cookie == 0x41424344){
(gdb) x/50x &buf
0x7ffeefbffab0: 0x41424344  0x41424344  0x41424344  0x41424344
0x7ffeefbffac0: 0x41424344  0x41424344  0x41424344  0x41424344
0x7ffeefbffad0: 0x41424344  0x41424344  0x41424344  0x41424344
0x7ffeefbffae0: 0x41424344  0x41424344  0x41424344  0x41424344
0x7ffeefbffaf0: 0x41424344  0x41424344  0x41424344  0x41424344
0x7ffeefbffb00: 0x41424344  0x00007f00  0x00011025  0x00000000
0x7ffeefbffb10: 0xefbffb28  0x00007ffe  0x20545f3d  0x00007fff
0x7ffeefbffb20: 0x20545f3d  0x00007fff  0x00000000  0x00000000
0x7ffeefbffb30: 0x00000001  0x00000000  0xefbffcb0  0x00007ffe
0x7ffeefbffb40: 0x00000000  0x00000000  0xefbffd09  0x00007ffe
0x7ffeefbffb50: 0xefbffd4b  0x00007ffe  0xefbffd65  0x00007ffe
0x7ffeefbffb60: 0xefbffd74  0x00007ffe  0xefbffd85  0x00007ffe
0x7ffeefbffb70: 0xefbffdce  0x00007ffe

为什么我的 C 程序地址 0xefbffab0 与 gdb 给我的地址 0x7ffeefbffab0 不匹配? 0x7ffe前缀从何而来?

您使用了错误的格式说明符来打印指针。 x 说明符用于 unsigned int,在您的系统上它是 32 位的,因此只打印地址的一部分(但这只是巧合,使用错误的格式说明符是未定义的行为)。你要的那个是p,是给void *:

printf("A: %p B: %p\n", &buf, &cookie);