運行以下代碼會產生分段錯誤:
fn main() {
let val = 1;
let ptr = val as *const i32;
unsafe { println!("{:?}", *ptr) };
}
輸出:
[1] 69212 segmentation fault (core dumped) cargo r
但是,當在宣告原始指標時val作為參考放入時,代碼會按預期運行并列印出來。&val
fn main() {
let val = 1;
let ptr = &val as *const i32;
unsafe { println!("{:?}", *ptr) };
}
輸出:
1
那么這里的共享參考在做什么,為什么沒有它程式會失敗?rust 中的參考不也是帶有額外原理圖的指標嗎?為什么我們需要創建一個指向參考而不是直接指向val自身的指標?
uj5u.com熱心網友回復:
這個問題可以通過查看您提供的兩個代碼行的不同語意來回答。
fn main() {
let val = 1;
println!("{:?}", val as *const i32); // Output: 0x1
println!("{:?}", &val as *const i32); // Output: 0x7ff7b36a4eec (probably little different)
}
如果沒有參考,則變數的值將被用于取消參考記憶體。這當然會導致分段錯誤,因為它不在程式允許的地址范圍內。
只有在使用參考運算子時,變數的地址才會轉換為原始指標,然后可以在沒有任何分段錯誤的情況下取消參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/496577.html
下一篇:限定符在結構指標上被丟棄
