链表中的指针损坏

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

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

有几种可能性。

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

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

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

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

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

Yuo可以保持一个双重链表。 然后你可以检查node-> child-> parent == node(虽然如果node-> child已经损坏,这有可能导致exception)

几个调试器/绑定检查器将为您执行此操作,但对此问题的一种便宜且快速的解决方案是

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

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

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