我正在撰寫一個模擬龜兔賽跑的程式。
它們都沿著由 70 個元素組成的兩個不同的一維陣列移動,當然,由于它們向前和向后移動,它們最終可能會超出元素 0 或 69。
我想使用指標比較來檢查它們是否這樣做,所以問題來了:
我知道如果我們正在比較指向同一陣列元素的指標,那么指標比較是合法的,因為否則我們無法確定它們在記憶體中的位置;仍然,假設我們有:
char arr[70];
char *p1 = &arr[0]
char *p2 = &arr[69]
我們不能確定p1 > p1 - 3
and p2 < p2 6
,因為在這種情況下,地址是連續的嗎?我們肯定知道哪個先來,什么不是,對吧?
我做了各種測驗,看起來確實如此,但我想確定一下。
uj5u.com熱心網友回復:
不可以。只有比較指向陣列物件中的元素或陣列物件末尾的指標才有效。但是這里還有另一個問題。
正如上面定義的那樣(p1
指向 的第一個元素arr
并p2
指向 的最后一個元素arr
),您可能會認為嘗試取消參考p1 - 3
或p2 6
會導致未定義的行為;但即使嘗試形成地址p1 - 3
或p2 6
使用指標運算也會導致未定義的行為,因此在嘗試此指標運算時程式無效。您可以使用指標算術來形成陣列物件內的地址,或陣列物件末尾的地址。不能使用指標演算法從指向陣列元素的指標形成其他地址。
uj5u.com熱心網友回復:
我們不能確定嗎
p1 > p1 - 3
從理論上講,不,因為 C 中的無符號整數/指標環繞。
實際上,我們可以肯定 -arr
永遠不會從地址 <= 3 開始,因此減去 3 最終會導致無符號整數回繞。
p2 < p2 6
與上面相同,但正整數環繞。的記憶體區域的最后一個地址arr
不會小于記憶體區域末尾的 6 個位元組。
但是請注意,取消參考(即 , *(p1-3)
)*(p2 6)
是未定義的行為,因為那里沒有您分配的記憶體。它很可能會導致段錯誤、讀取一些其他資料或觸發堆疊保護金絲雀。不管怎樣,實際上,它可能會讓你的房子著火,這對于編譯器來說是一件有效的事情,它可以讓你的程式在你呼叫未定義的行為時執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506456.html