将内存地址存储在char *和&在gdb中

时间:2015-06-01 02:08:16

标签: c pointers memory

我正在尝试创建一个指针地址链,第一个指向下一个地址,依此类推。

例如,char *a的地址为0x1char *b地址为0x2char *x地址为0x3。我想链接a - > b - > c,以便我希望将值0x2存储到0x1内存地址,值{ {1}}进入0x3内存地址。

我有以下代码:

0x2

当我运行gdb时,检查那些内存地址。在第一次和第二次致电#define PUT(p, val) (*(unsigned long *)(p) = (val)) #define SET_NEXT_PTR(p, ptr) (*(char**)(p) = (char*)((unsigned long)(ptr))) void chain(char* bp){ char *first = mem_sbrk(size); char *second =mem_sbrk(size); PUT(first, (unsigned long)bp); PUT(bp, *second); } 之后。

mem_sbrk

致电(gdb) x /x first 0x7ffff661c020: 0x00000000 (gdb) x /x bp 0x7ffff661b020: 0x00000000 (gdb) x/x second 0x7ffff661d020: 0x00000000 宏后:

PUT

看起来很有效。但我想知道如何将这些内存地址转换为指针。由于整个内存地址存储为(gdb) x/x second 0x7ffff661d020: 0x00000000 0x00000000 (gdb) x /2x first 0x7ffff661c020: 0xf661b020 0x00007fff (gdb) p first 0x7ffff661c020 " \260a\366\377\177" (gdb) x /2x bp 0x7ffff661b020: 0xf661d020 0x00007fff 0x7ffff661d020。当我首先使用0x7ffff661d024时,它会返回一个无意义的字符串。

第二个问题,在我调用

时在gdb中
p

我想知道(gdb) p &bp (char **) 0x7fffffffe3e8 是什么?我认为0x7fffffffe3e8用于获取内存地址,我希望gdb显示

&

第三个问题

之间有什么区别
(void*) 0x7ffff661b020

0 个答案:

没有答案