代码如下:
pub struct Node<T> {
data: Option<T>,
level: usize,
forward: [Option<*mut Node<T>>; MAX_HEIGHT],
}
我想遍历链表:
// let next = some_node.forward[n];
unsafe {
loop {
match next {
None => { break; }
Some(v) => {
write!(f, "{:?}", (*v).data)?;
break;
}
}
}
}
当我使用关键字unsafe时,出现[1] 74042 illegal hardware instruction cargo run
错误,因此是否有调试该不安全块的方法?
答案 0 :(得分:2)
unsafe
是一种表达方式,“闭嘴,,我知道自己在做什么”。在这种情况下,您要确保编译器确保v
始终是指向Node<T>
的有效对齐指针,forward
的数组索引可以解析为Option<*mut Node<T>>
的数组大小为MAX_HEIGHT
。如果违反了这些假设中的任何一个,您将回到未定义的行为领域。
您已经关闭所有安全措施,并将编译器对准未知的指针。我大脑的理性部分想确切地知道您要在这里完成什么。
对于所提供的信息,我可以提供的最佳建议是使用rust-gdb
并逐步执行程序,直到指针看起来没有理智为止。