C语言 理解双链表结构的内存



这是一个家庭作业问题。我的书中没有提到如何筛选地址,所以我需要一些帮助

给定一个结构体

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。从第一个地址开始,检查它指向哪里,然后到下一组内存

2。第一组字节将保存该节点的值,第二组字节将保存指向下一个节点的指针

3。继续

但是,这里不起作用。

第一个节点位于0x602060。到那里检查字节显示没有变量值,后面跟着一个指向下一个节点0x602090的指针。

0x0000000000000000      0x0000000000602090

转到0x602090表示两个部分中没有明显返回地址的字节。考虑到结构体的大小,我假设首先显示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的节点),而不是指向下一个节点的指针。

相关内容

  • 没有找到相关文章

最新更新