【问题标题】:Understanding memory of Doubly linked list struct了解双向链表结构的内存
【发布时间】:2015-12-27 18:28:52
【问题描述】:

这是一道作业题。我的书没有说明如何实际筛选地址,所以我需要一些帮助

给定一个结构

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 开始。

有人可以给我一些关于我应该如何遍历它的提示吗?非常感谢任何帮助。

【问题讨论】:

  • 0x0000000a74656772 是内存中字符串的结尾。它不是节点结构的一部分。 0x0000000000000000 0x0000000000000031 可能是为第一个节点的字符串分配的内存的结尾,31 似乎是分配的大小。
  • 32 位还是 64 位平台?

标签: c memory data-structures linked-list doubly-linked-list


【解决方案1】:

您的结构包含 4 个 64 位值。从地址 0x602060 开始的完整结构实际上分布在内存转储的两行中:

                       prev                     str
0x602060:       0x0000000000000000      0x0000000000602090
0x602070:       0x000000000000000d      0x0000000000602010
                      strsize                   next

请注意,0x0000000000000000 的长度为 64 位,即 16 位十六进制数字。

指针0x0000000000602090实际上是指向字符串数据的指针(对于0x602060处的节点),而不是指向下一个节点的指针。

【讨论】:

  • 非常感谢。我不知道每个值都会占用完整的 16 十六进制行,因为我总是有多个数字放在同一行中的概念,但我不认为 int 必须是单独的,因为所有其他变量都必须占用整个 16 十六进制线。再次感谢您!
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多