我正在尝试创建一个指针地址链,第一个指向下一个地址,依此类推。
例如,char *a
的地址为0x1
,char *b
地址为0x2
,char *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