我有一個指向元素buf: *const T分配開始的指標,我定義了以下檢查:nT
let in_alloc = buf <= ptr && ptr < unsafe { buf.add(n) };
是否保證in_alloc適用于分配中的true任何內容,以及在任何其他情況下?我們可以假設它是一個指向物件的有效指標(因此不會錯位/空/懸空),但是它可能來自或不來自與. 最后我們可以假設不是零大小的。ptrbuffalseptrTbufT
uj5u.com熱心網友回復:
回答標題,比較任意兩個指標是明確定義的,因為指標實作Ord了.
隨著指標完全有序,問題的主體很容易由此而來。你有一組n不同的指標,從 開始到buf 0結束buf (n - 1)。如果ptr小于buf則不能等于其中任何一個。如果ptr大于buf (n - 1)它也不能等于它們。如果ptr是其中之一,則兩個運算式的計算結果都為真。
uj5u.com熱心網友回復:
根據官方檔案,在指標指向的物件分配后一個位元組產生一個原始指標是有效的(所以 1)。顯然你不能取消參考指標,但它可以用于比較,例如。用于回圈中的邊界檢查。
除此之外,這是未定義的行為,因此您根本無法保證任何事情。在您的情況下,由于這個原因,向指標添加任意偏移量并不是一個好主意。
因此,更具體地說,只要buf.add(n)指向一個地址,該地址最多超過物件buf指向的分配 1 個位元組,它就會回傳您期望的值。
有關更多詳細資訊,請參閱https://doc.rust-lang.org/1.59.0/std/primitive.pointer.html#method.offset。
uj5u.com熱心網友回復:
是的,此代碼可以正常作業,但除外。比較指向不同分配的指標的行為應符合 std::ptr::eq 檔案所暗示的預期。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439009.html
