理解双向链表结构的内存
Understanding memory of Doubly linked list struct
这是一道作业题。我的书没有说明如何实际筛选地址,所以我需要一些帮助
给定一个结构
struct lnode {
struct lnode *prev;
char *str;
int strsize;
struct lnode *next;
};
链表从地址 0x0602060 开始,查看该地址周围的内存我们看到
(gdb) x/36x 0x0602010
0x602010: 0x0000000000602060 0x0000000000602040
0x602020: 0x0000000000000016 0x00000000006020b0
0x602030: 0x0000000000000000 0x0000000000000021
0x602040: 0x206d72657464696d 0x756874206e6f2031
0x602050: 0x00000a7961647372 0x0000000000000031
0x602060: 0x0000000000000000 0x0000000000602090
0x602070: 0x000000000000000d 0x0000000000602010
0x602080: 0x0000000000000000 0x0000000000000021
0x602090: 0x6f662074276e6f64 0x0000000a74656772
0x6020a0: 0x0000000000000000 0x0000000000000031
0x6020b0: 0x0000000000602010 0x00000000006020e0
0x6020c0: 0x0000000000000016 0x0000000000000000
0x6020d0: 0x0000000000000000 0x0000000000000021
0x6020e0: 0x2035206573616870 0x6d20657564207369
0x6020f0: 0x00000a7961646e6f 0x0000000000020f11
0x602100: 0x0000000000000000 0x0000000000000000
0x602110: 0x0000000000000000 0x0000000000000000
0x602120: 0x0000000000000000 0x0000000000000000
我明白我将如何遍历内存中具有单个变量的单向链表。
我会:
1.Begin在第一个地址,查看它指向哪里,顺着那个指向下一组内存
2.The 第一组字节将保存该节点中的值,第二组将保存指向下一个节点的指针
3.Continue
但是,这在这里不起作用。
据说第一个节点位于 0x602060。去那里检查字节发现没有变量值,后面是指向下一个节点的指针 0x602090.
0x0000000000000000 0x0000000000602090
转到 0x602090 会在两个部分中显示没有明显 return 地址的字节。考虑到结构的大小,我假设首先显示 char 指针,然后第二列中的大小如下
0x6f662074276e6f64 (char*) 0x0000000a74656772 (int with padding)
继续,但是,我正在看的东西开始变得不那么有意义了
我的假设是接下来的两行
(1) 0x0000000000000000 0x0000000000000031
(2) 0x0000000000602010 0x00000000006020e0
表示 (1) 一些我们不必考虑的未知结果和 (2) 前一个指针后跟下一个指针?
但是前一个指针和起始位置不一样。而我假设一个节点由 3 行块表示似乎并不成立,从地址 0x6020e0 开始。
有人可以给我一些关于我应该如何遍历它的提示吗?非常感谢任何帮助。
您的结构包含 4 个 64 位值。从地址 0x602060 开始的完整结构实际上分布在内存转储的两行中:
prev str
0x602060: 0x0000000000000000 0x0000000000602090
0x602070: 0x000000000000000d 0x0000000000602010
strsize next
注意 0x0000000000000000
是 64 位长,或 16 个十六进制数字。
指针0x0000000000602090实际上是指向字符串数据的指针(对于0x602060处的节点),而不是指向下一个节点的指针。
这是一道作业题。我的书没有说明如何实际筛选地址,所以我需要一些帮助
给定一个结构
struct lnode {
struct lnode *prev;
char *str;
int strsize;
struct lnode *next;
};
链表从地址 0x0602060 开始,查看该地址周围的内存我们看到
(gdb) x/36x 0x0602010
0x602010: 0x0000000000602060 0x0000000000602040
0x602020: 0x0000000000000016 0x00000000006020b0
0x602030: 0x0000000000000000 0x0000000000000021
0x602040: 0x206d72657464696d 0x756874206e6f2031
0x602050: 0x00000a7961647372 0x0000000000000031
0x602060: 0x0000000000000000 0x0000000000602090
0x602070: 0x000000000000000d 0x0000000000602010
0x602080: 0x0000000000000000 0x0000000000000021
0x602090: 0x6f662074276e6f64 0x0000000a74656772
0x6020a0: 0x0000000000000000 0x0000000000000031
0x6020b0: 0x0000000000602010 0x00000000006020e0
0x6020c0: 0x0000000000000016 0x0000000000000000
0x6020d0: 0x0000000000000000 0x0000000000000021
0x6020e0: 0x2035206573616870 0x6d20657564207369
0x6020f0: 0x00000a7961646e6f 0x0000000000020f11
0x602100: 0x0000000000000000 0x0000000000000000
0x602110: 0x0000000000000000 0x0000000000000000
0x602120: 0x0000000000000000 0x0000000000000000
我明白我将如何遍历内存中具有单个变量的单向链表。 我会:
1.Begin在第一个地址,查看它指向哪里,顺着那个指向下一组内存
2.The 第一组字节将保存该节点中的值,第二组将保存指向下一个节点的指针
3.Continue
但是,这在这里不起作用。
据说第一个节点位于 0x602060。去那里检查字节发现没有变量值,后面是指向下一个节点的指针 0x602090.
0x0000000000000000 0x0000000000602090
转到 0x602090 会在两个部分中显示没有明显 return 地址的字节。考虑到结构的大小,我假设首先显示 char 指针,然后第二列中的大小如下
0x6f662074276e6f64 (char*) 0x0000000a74656772 (int with padding)
继续,但是,我正在看的东西开始变得不那么有意义了 我的假设是接下来的两行
(1) 0x0000000000000000 0x0000000000000031
(2) 0x0000000000602010 0x00000000006020e0
表示 (1) 一些我们不必考虑的未知结果和 (2) 前一个指针后跟下一个指针? 但是前一个指针和起始位置不一样。而我假设一个节点由 3 行块表示似乎并不成立,从地址 0x6020e0 开始。
有人可以给我一些关于我应该如何遍历它的提示吗?非常感谢任何帮助。
您的结构包含 4 个 64 位值。从地址 0x602060 开始的完整结构实际上分布在内存转储的两行中:
prev str
0x602060: 0x0000000000000000 0x0000000000602090
0x602070: 0x000000000000000d 0x0000000000602010
strsize next
注意 0x0000000000000000
是 64 位长,或 16 个十六进制数字。
指针0x0000000000602090实际上是指向字符串数据的指针(对于0x602060处的节点),而不是指向下一个节点的指针。