簡體   English   中英

鏈表中的指針損壞

[英]Corrupt pointer in a linked list

如果鏈表中的一個指針是否已損壞,您如何才能找到它?

在節點結構中引入神奇的值。 在新節點分配時初始化它。 在每次訪問之前,檢查指針指向的節點結構是否包含有效的魔術。 如果指針指向不可讀的數據塊,則程序將崩潰。 為此,在Windows上有API VirtualQuery() - 在讀取之前調用它,並確保指針指向可讀數據。

有幾種可能性。

如果列表是雙向鏈接的,則可以從前指針指向的位置檢查后退指針,反之亦然。

如果您對預期的內存地址范圍有所了解,可以查看。 尤其如此,鏈表是從有限數量的內存塊中分配的,而不是單獨分配每個節點。

如果節點中包含一些可識別的數據,則可以運行列表並檢查可識別的數據。

這對我來說就像其中一個問題,其中面試官不期待一個快速的回答,而是對問題的分析,包括你的進一步問題。

這有點痛苦,但您可以在調試器遇到它們時記錄每個指針的值,並驗證它與您期望找到的一致(如果您希望指針為NULL,請確保它是NULL。如果您希望指針指向已存在的對象,請驗證該對象的地址是否具有該值,等等。

Yuo可以保持雙重鏈接列表。 然后你可以檢查node-> child-> parent == node(雖然如果node-> child已經損壞,這有可能導致異常)

幾個調試器/綁定檢查器將為您執行此操作,但這個問題的便宜和快速解決方案是

  • 改變列表節點的結構以包括一個額外的char [n]字段(或者更通常是兩個,一個作為第一個作為結構中的最后一個字段,因此除了指針損壞之外還允許邊界檢查)。
  • 在創建節點時,使用短的(但足夠長的......)常量字符串(例如“VaL1D-LiST-NODE 1234”)初始化這些字段。
  • 檢查此(這些)字段中讀取的值是否與預期文本匹配,每次取消引用節點時,以及在認真使用節點之前。

當字段'的值不匹配時,這表示:

  • 指針無效(它從不指向列表節點)
  • 其他東西正在覆蓋節點結構(指針是“有效的”,但它指向的數據已被破壞)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM