链表中的指针损坏

时间:2010-11-02 15:18:26

标签: c data-structures

如果链接列表中的某个指针是否已损坏,您会如何找到?

5 个答案:

答案 0 :(得分:9)

在节点结构中引入魔术值。在新节点分配时初始化它。在每次访问之前,检查指针指向的节点结构是否包含有效的魔术。如果指针指向不可读的数据块,则程序将崩溃。为此,在Windows上有API VirtualQuery() - 在读取之前调用它,并确保指针指向可读数据。

答案 1 :(得分:3)

有几种可能性。

如果列表是双向链接的,则可以从前指针指向的位置检查后退指针,反之亦然。

如果您对预期的内存地址范围有所了解,可以查看。特别是链接列表是从有限数量的内存块中分配的,而不是单独分配每个节点。

如果节点中包含一些可识别的数据,您可以在列表中运行并检查可识别的数据。

在我看来,这就是其中一个问题,其中面试官并不期待一个快速的答案,而是对问题的分析,包括你的进一步问题。

答案 2 :(得分:1)

这有点痛苦,但你可以在调试器遇到它们时记录每个指针的值,并验证它与你期望找到的一致(如果你希望指针为NULL ,确保它为NULL。如果你希望指针指向一个已经存在的对象,请验证该对象的地址是否具有该值等。)。

答案 3 :(得分:1)

Yu可以保持双重链表。然后你可以检查node-> child-> parent == node(虽然如果node-> child已经腐败,这有可能导致异常)

答案 4 :(得分:0)

几个调试器/绑定检查器会为你做这个,但是这个问题的一个便宜而快速的解决方案是

  • 更改列表节点的结构以包含一个额外的char [n]字段(或者更通常为两个,一个作为结构中的最后一个字段,另一个作为结构中的最后一个字段,因此除了指针损坏之外还允许边界检查)
  • 在创建节点时,使用短的(但足够长的......)常量字符串(例如“VaL1D-LiST-NODE 1234”)初始化这些字段。
  • 检查此(这些)字段中读取的值是否与预期文本匹配,每次取消引用节点时,以及在认真使用节点之前。

当字段'值不匹配时,这表示:

  • 指针无效(它从不指向列表节点)
  • 其他东西正在覆盖节点结构(指针“有效”但指向的数据已损坏)。